1,设计:代理模式,责任连模式
2,实现:JDK实现,cglib实现
3,织入的时机:
1)编译期:AspectJ
2)类加载时:AspectJ
3)运行时:Spring AOP,如何实现?代理模式
4,代理分为静态代理和动态代理
客户端通过代理对象,间接地和目标对象打交道,这样模式,代理对象就可以在执行目标方法的前后做一些额外的操作。
1)客户端通过接口来引用目标对象,体现了面向接口编程。
![](https://img.haomeiwen.com/i10132677/9dc9ed023eccf1eb.png)
2)代理对象把真正的方法委托给目标对象来执行。自己执行额外的逻辑,也就是AOP织入的逻辑。
5,JDK实现
1,通过java.lang.reflect.Proxy获取代理类。
2,织入的逻辑写在InvocationHandler接口的实现类中,这个实现类就相当于AOP中的切面类Aspect,因为我们织入的逻辑也是写在被标记@Aspect的类中。
3,只能基于接口进行动态代理。
客户端调用:
Subject subject = (Subject) Proxy
.newProxyInstance(Client.class.getClassLoader(), new Class[]{Subject.class},
new JdkProxySubject(new RealSubject()));
参数:
1,classLoader
2,实现的接口
3,InvocationHandler
6,cglib
1)基于继承的方式实现代理模式
2)通过method interceptor 来织入我们的代码
MethodIntercepter,用方法去反射调用目标对象的方法,把真正的逻辑委托给目标对象。
7,jdk与cglib代理对比:
1)JDK只能针对有接口的类的接口方法进行动态代理。由于接口中是不允许有private方法的,所以其实JDK也不能对private方法进行代理。
2)cglib基于继承来实现代理,无法对static,final类进行代理。
3)cglib基于继承来实现代理,无法对private,static方法进行代理。
8,spring如何创建AOP代理类
![](https://img.haomeiwen.com/i10132677/2d55c58a81e28be4.png)
![](https://img.haomeiwen.com/i10132677/4bd76dd394370bed.png)
1)如果目标对象实现了接口,则默认采用JDK动态代理
2)如果目标对象没有实现接口,则采用cglib进行动态代理
3)如果目标对象实现了接口,且强制使用cglib代理,则使用cglib
![](https://img.haomeiwen.com/i10132677/325de5e169598c96.png)
9,AOP链式调用
多个AOP作用于同一个目标对象的时候,它们是如何叠加在一起的?
采用了责任连模式:
![](https://img.haomeiwen.com/i10132677/08ea11583e8eaa6a.png)
网友评论