AOP
AOP常见的两种代理方式JDK和CGLiB
- JDK动态代理主要针对的对象必须是某个接口的实现,他是通过在运行期间创建一个接口的实现类来完成对目标的代理
- CGLIB代理,实现原理类似于JDK动态代理,只是它在运行期间生成的代理对象是针对目标类扩展的子类。CHLIB是高效的代码生成包,底层是依靠ASM(开源的JAVA字节码编辑类库)操作字节码实现的,性能比JDK更强。
- expose-proxy:有时候目标对象内部的自我调用将无法实施切面中的增强。
创建AOP代理
主要有两个步骤
- 获取增强方法或者增强器
- 更具获取的增强器进行代理
获取增强器
- 获取所有的BeanName,后去的是所有在beanFactory中注册的bean
- 便利所有的BeanName,找出声明饿了AspectJ注解的类
- 对标记为AspectJ注解的类进行增强器提取
- 将提取结果加入缓存。
寻找匹配的增强器
创建代理
对于代理类的创建和处理,Spring 是通过ProxyFactory来处理的,而函数中主要是对ProxyFactory的初始化操作,主要过程是
1. 获取当前类的属性
2. 添加代理接口
3. 封装Advisor并加入到ProxyFactory中
4. 设置要代理的类
5. 通过定制的函数customizeProxyFactory,对ProxyFactory进行进一步封装
6. 进行获取代理操作