一、注册AnnotationAwareAspectJAutoProxyCreator
,引入postProcessAfterInitialization
1、Spring 入口:
<aop:aspectj-autoproxy />
registerAspectJAnnotationAutoProxyCreatorIfNecessary,
注册AnnotationAwareAspectJAutoProxyCreator
AnnotationAwareAspectJAutoProxyCreator
类的层次结构
AnnotationAwareAspectJAutoProxyCreator
实现了BeanPostProcessor
接口,而实现BeanPostProcessor
后,当Spring加载这个Bean
时会在实例化前调用其postProcessAfterInitialization
2、SpringBoot 入口:
@EnableAspectJAutoProxy
AspectJAutoProxyRegister
在AspectJAutoProxyRegister
中,实际上就是将AspectJAnnotationAutoProxyCreator
的BeanDefinition
注册到IoC 容器当中
(AnnotationAwareAspectJAutoProxyCreator
继承AspectJAnnotationAutoProxyCreator,
AspectJAnnotationAutoProxyCreator继承AbstractAutoProxyCreator
)
而AspectJAnnotationAutoProxyCreator
是一个BeanPostProcessor,
在实例化前调用其postProcessAfterInitialization
,postProcessAfterInitialization
会执行创建代理类的操作
二、创建代理
1、获取增强器
2、寻找匹配增强器
3、创建代理
(1)判断是采用JDK动态代理还是CGLIB动态代理
(2)以JDK动态代理为例,调用invoke方法,此方法维护一个计数器,记录调用链的当前位置
此部分源码解析可参考:Spring源码深度解析第2版
有关这3个部分的介绍抽丝剥茧,极为详细,不赘述。
另有参考博客:
向您图文并茂生动讲解Spring AOP 源码(1) - 掘金
向您图文并茂生动讲解Spring AOP 源码(2) - 掘金
向您生动地讲解Spring AOP 源码(3) - 掘金
感兴趣的读者可参考阅读
补充:
SpringBoot中,引入AOP依赖包后,一般来说并不需要去做其他配置,使用过Spring注解配置方式的人会问是否需要在程序主类中增加@EnableAspectJAutoProxy来启用,实际并不需要。
因为在AOP的默认配置属性中,spring.aop.auto属性默认是开启的,也就是说只要引入了AOP依赖后,默认已经增加了@EnableAspectJAutoProxy
advisor 可以就看成 pointcut + advise的一个组合对象