
一、spring注册 AnnotationAwareAspectJAutoProxyCreator
-  通过 @EnableAspectJAutoProxy可以看到先把AspectJAutoProxyRegistrar通过@Import注册到spring。 
-  AspectJAutoProxyRegistrar实现了ImportBeanDefinitionRegistrar接口,所以就有了将某个bean引入spring 的能力。再接下来的运行中会把 AnnotationAwareAspectJAutoProxyCreator.class 以beanName为org.springframework.aop.config.internalAutoProxyCreator注册到spring中。![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p31z2bQz-1674821484013)(/Users/liuyanfei/work/idea20182/workspace/mywork/lyf-iron-man-component/iron-man-springbase/iron-man-spring1/src/md/3.aop原理/image-20230127191959587.png)]](https://img-blog.csdnimg.cn/055de96424bd460ca0e6d200c428808c.png) 
二、 AnnotationAwareAspectJAutoProxyCreator分析
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-txKR033p-1674821484013)(/Users/liuyanfei/work/idea20182/workspace/mywork/lyf-iron-man-component/iron-man-springbase/iron-man-spring1/src/md/3.aop原理/image-20230127193327946.png)]](https://img-blog.csdnimg.cn/3ec853ee1b6e4aafb7d44a1778df128e.png)
- 通过查看 AnnotationAwareAspectJAutoProxyCreator的类继承图可以清楚的看到实现了 BeanPostProcessor接口,所以AnnotationAwareAspectJAutoProxyCreator注册到spring以后成为了spring 的 BeanPostProcessor后置处理器。
- BeanPostProcessor 接口 的postProcessBeforeInstantiation()、postProcessAfterInitialization(),在 AbstractAutoProxyCreator中已经得到了实现。(后面拿代理对象的时候就是在AbstractAutoProxyCreator.postProcessAfterInitialization())中去处理的。
三、获取代理对象
-  由图1可知,在bean init 初始化的时候会前后调用 后置处理器的 postProcessBeforeInstantiation()、postProcessAfterInitialization()。代码如下![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M0pBLoOw-1674821484014)(/Users/liuyanfei/work/idea20182/workspace/mywork/lyf-iron-man-component/iron-man-springbase/iron-man-spring1/src/md/3.aop原理/image-20230127195251942.png)]](https://img-blog.csdnimg.cn/18d59944dcd3412f86656f3d7bdad4a6.png) 
-  当前Bean在获取代理对象主要是在 postProcessAfterInitialization()方法中去获取的。Bean在获取代理对象时会判断当前的bean是否实现了接口- 如果实现了接口,那么就使用jdk 的动态代理来生成bean 的代理对象
- 如果没有实现接口,那么就使用Cglib 来生成当前bean 的代理对象(因为jdk 动态代理的对象必须是实现了接口的bean)
 
-  即使没有做切片的Bean 也会调用这个 postProcessAfterInitialization(),但是会验证当前Bean有没有切片,没有切片的话就不会被代理了。
四、代理链(以JDK动态代理对象为例)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q8m0Up0b-1674821484014)(/Users/liuyanfei/work/idea20182/workspace/mywork/lyf-iron-man-component/iron-man-springbase/iron-man-spring1/src/md/3.aop原理/5.aop实现原理下--代理过程.png)]](https://img-blog.csdnimg.cn/8059cf864b9641e59c752d556737777f.png)
-  用jdk 的动态代理代理Bean,那么被代理的bean在执行任何方法的时候就会进入到 JdkDynamicAopProxy 的 invoke()方法。
-  invoke()方法的调用链如上。这个调用链实际上是使用 责任链模式来做的,调用是环环相扣的,上图为了简化有失准确。具体的逻辑见下图




















