spring--day02笔记 联系客服

发布时间 : 星期日 文章spring--day02笔记更新完毕开始阅读

1 AOP

1.1 介绍

? ?

AOP Aspect Oriented Programing 面向切面编程

AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码 经典应用:性能监视、事务管理、安全检查、缓存) Spring AOP使用纯Java实现,不需要专门的编译过程和类加载器,在运行(反射)期通过代理方式向目标类织入增强代码

? AspectJ是一个基于Java语言的AOP框架,Spring2.0开始,Spring AOP引入对Aspect的支持,AspectJ扩

展了Java语言,提供了一个专门的编译器,在编译时提供横向代码的织入

1.2 术语(重要)

? ? ? ? ? ? ? ?

Target :目标类,需要被增强程序。

JoinPoint:连接点,目标类中可以被增强的方法。例如:addUser、updateUser

PointCur:切入点,已经被增强的连接点JointPoint。增强已经生效。例如:addUser 切入点 是 连接点 一个子集。

Advice:增强/通知,用于增强的方法。例如:before() /after() Intruduction 引介,特殊通知:类添加方法或字段等。(了解) Weaving 织入:将通知(增强)应用目标类,生产代理过程。 Proxy:代理

Aspect 切面:将通知Adivce 和 切入点 PointCut 结合在一起。

? 切面类:用于存放所有的通知Adivce

1.3 手动代理

? 编写目标类

? 编写切面类(通知)

? 编写代理类(将通知 和 目标类 结合--织入)

1.3.1 动态代理:接口+实现类

1.3.1.1 目标类

public interface UserService { public void addUser(); public void updateUser(); } public class UserServiceImpl implements UserService { @Override public void addUser() { System.out.println(\); } @Override public void updateUser() { System.out.println(\); } } 1.3.1.2 切面类

/** * 切面类:提供多个通知(advice),通知就是用于增强代码 * @author * */ public class MyAspect { public void before(){ System.out.println(\开启事务\); } public void after(){ System.out.println(\提交事务\); } }

1.3.1.3 代理类

/** * 工厂:用于生产UserService * @author * */ public class MyBeanFactory { //使用jdk动态代理 生产代理类,将目标类 与 通知切面在一起。 public static UserService getBean() { //1 目标类 final UserService userService = new UserServiceImpl(); //2 切面类(通知) final MyAspect myAspect = new MyAspect(); //3 代理类 return (UserService)Proxy.newProxyInstance( MyBeanFactory.class.getClassLoader(), //类加器器:用于将代理类加载到内存 userService.getClass().getInterfaces(), //接口:确定代理需要的方法 累的invoke方法 args) } } new InvocationHandler() { //处理类:代理的方法执行一次,就调用处理 @Override public Object invoke(Object proxy, Method method, Object[] throws Throwable { //1 执行通知--开启事务 myAspect.before(); //2 目标类的方法 Object obj = method.invoke(userService, args); //3执行通知 -- 提交事务 myAspect.after(); return obj; } }); 1.3.1.4 测试

public class TestApp { @Test public void demo01(){ //自己创建实例 UserService userService = new UserServiceImpl(); userService.addUser(); userService.updateUser(); } @Test public void demo02(){ //spring创建实例,及工厂创建。 UserService userService = MyBeanFactory.getBean(); userService.addUser(); userService.updateUser(); } }