一、spring注册 AnnotationAwareAspectJAutoProxyCreator
-
通过
@EnableAspectJAutoProxy
可以看到先把AspectJAutoProxyRegistrar
通过@Import
注册到spring。 -
AspectJAutoProxyRegistrar
实现了ImportBeanDefinitionRegistrar
接口,所以就有了将某个bean引入spring 的能力。再接下来的运行中会把 AnnotationAwareAspectJAutoProxyCreator.class 以beanName为org.springframework.aop.config.internalAutoProxyCreator注册到spring中。
二、 AnnotationAwareAspectJAutoProxyCreator分析
- 通过查看 AnnotationAwareAspectJAutoProxyCreator的类继承图可以清楚的看到实现了 BeanPostProcessor接口,所以AnnotationAwareAspectJAutoProxyCreator注册到spring以后成为了spring 的 BeanPostProcessor后置处理器。
- BeanPostProcessor 接口 的
postProcessBeforeInstantiation()、postProcessAfterInitialization()
,在 AbstractAutoProxyCreator中已经得到了实现。(后面拿代理对象的时候就是在AbstractAutoProxyCreator.postProcessAfterInitialization())中去处理的。
三、获取代理对象
-
由图1可知,在bean init 初始化的时候会前后调用 后置处理器的
postProcessBeforeInstantiation()、postProcessAfterInitialization()
。代码如下 -
当前Bean在获取代理对象主要是在
postProcessAfterInitialization()
方法中去获取的。Bean在获取代理对象时会判断当前的bean是否实现了接口- 如果实现了接口,那么就使用jdk 的动态代理来生成bean 的代理对象
- 如果没有实现接口,那么就使用Cglib 来生成当前bean 的代理对象(因为jdk 动态代理的对象必须是实现了接口的bean)
-
即使没有做切片的Bean 也会调用这个
postProcessAfterInitialization()
,但是会验证当前Bean有没有切片,没有切片的话就不会被代理了。
四、代理链(以JDK动态代理对象为例)
-
用jdk 的动态代理代理Bean,那么被代理的bean在执行任何方法的时候就会进入到 JdkDynamicAopProxy 的
invoke()
方法。 -
invoke()
方法的调用链如上。这个调用链实际上是使用 责任链模式来做的,调用是环环相扣的,上图为了简化有失准确。具体的逻辑见下图