上一篇我们了解了它的一个小练习那么这一篇我们来看看原理其实整个注解中最重要的是@EnableAspectJAutoProxy注解它的作用也就是开启了AOP功能
那么我们追一追源码看看到底发生了什么?它是什么?
我们看到了它是给导入了AspectJAutoProxyRegistrar这个类我们在看看里面是什么
利用AspectJAutoProxyRegistrar自定义给容器中注册bean;BeanDefinetion
注册了什么bean呢?
我们简单看一下逻辑:
* 1、@EnableAspectJAutoProxy是什么?
* @Import(AspectJAutoProxyRegistrar.class):给容器中导入AspectJAutoProxyRegistrar
* 利用AspectJAutoProxyRegistrar自定义给容器中注册bean;BeanDefinetion
从源码逻辑我们可以知道
* internalAutoProxyCreator=AnnotationAwareAspectJAutoProxyCreator* 给容器中注册一个AnnotationAwareAspectJAutoProxyCreator;
翻译过来的意思是注解模式的AspectJ自动代理创建器那么这玩意儿是啥呢?
AOP原理:【看给容器中注册了什么组件,这个组件什么时候工作,这个组件的功能是什么?】
然后我们继续研究:
AnnotationAwareAspectJAutoProxyCreator:
* 继承AnnotationAwareAspectJAutoProxyCreator
* 继承->AspectJAwareAdvisorAutoProxyCreator
* 继承->AbstractAdvisorAutoProxyCreator
* 继承->AbstractAutoProxyCreator
* 实现implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware
* 关注后置处理器(在bean初始化完成前后做事情)、自动装配BeanFactory
好了终于找到重点了,我们在来分析 这个这么长的后置处理器和这个自动装配的BeanFactory做了哪些工作:
我们看到既然它有自动装配那么它肯定有一个,所以关注着两个方法
AbstractAutoProxyCreator.setBeanFactory()
* AbstractAutoProxyCreator.有后置处理器的逻辑;
然后我们在看上层结构:
AbstractAdvisorAutoProxyCreator(通知自动代理创建器)
我们在看 AspectJAwareAdvisorAutoProxyCreator 这个类做了什么(这个)
也就说专门针对AwareAdvisor的 但是这个类里面什么都没有
我们继续看子类里面的东西
也就是说父类setBeanFactory的时候调用了一个initBeanFactory
好我们分析到了顶层接下来我们在debug来分析一下也就是说在:关注后置处理器(在bean初始化完成前后做事情)、自动装配BeanFactory这个地方打个断点:
我们看到通过 this无参构造器创建对象然后把我们创的配置类注册进来
注册配置类,调用refresh()刷新容器;也就是把容器中的所有bean所有工作都做好,跟初始化容器一样
那么容器刷新怎么做的呢?看上图我们去528行 里面的方法很多我们看主要的
registerBeanPostProcessors(beanFactory);注册bean的后置处理器来方便拦截bean的创建;
1)、先获取ioc容器已经定义了的需要创建对象的所有BeanPostProcessor
3)、优先注册实现了PriorityOrdered接口的BeanPostProcessor;
4)、再给容器中注册实现了Ordered接口的BeanPostProcessor;
5)、注册没实现优先级接口的BeanPostProcessor;
6)、注册BeanPostProcessor,实际上就是创建BeanPostProcessor对象,保存在容器中;
我们从上面的代码中看到,它要去创建
创建internalAutoProxyCreator的BeanPostProcessor而实际上创建的类型也就是这个:
【AnnotationAwareAspectJAutoProxyCreator】
1)、创建Bean的实例
* 2)、populateBean;给bean的各种属性赋值
* 3)、initializeBean:初始化bean;
这里面的init初始化bean特别重要因为它的后置处理器就是在这个init中完成的所以我们看看init这bean做的事情
点进去我们看这个方法:
这里面也就是Aware接口的处理
在这个方法的上面有这个方法的调用:
1)、invokeAwareMethods():处理Aware接口的方法回调
2)、applyBeanPostProcessorsBeforeInitialization():应用后置处理器的postProcessBeforeInitialization()
而同时里面也有这几个的方法:
3)、invokeInitMethods();执行自定义的初始化方法
4)、applyBeanPostProcessorsAfterInitialization();执行后置处理器的postProcessAfterInitialization();
我们分析得出所有的后置处理的实现都是上面这几个方法得出来的.而完了之后
这里判断了是否实现了这个借口,如果是就调用:
方法来把它的bean来注册进去
我们总结下,上面所有的分析我们看到:
也就是我们开头所说的这个类的实现
1)、传入配置类,创建ioc容器
* 2)、注册配置类,调用refresh()刷新容器;
* 3)、registerBeanPostProcessors(beanFactory);注册bean的后置处理器来方便拦截bean的创建;
* 1)、先获取ioc容器已经定义了的需要创建对象的所有BeanPostProcessor
* 2)、给容器中加别的BeanPostProcessor
* 3)、优先注册实现了PriorityOrdered接口的BeanPostProcessor;
* 4)、再给容器中注册实现了Ordered接口的BeanPostProcessor;
* 5)、注册没实现优先级接口的BeanPostProcessor;
* 6)、注册BeanPostProcessor,实际上就是创建BeanPostProcessor对象,保存在容器中;
* 创建internalAutoProxyCreator的BeanPostProcessor【AnnotationAwareAspectJAutoProxyCreator】
* 1)、创建Bean的实例
* 2)、populateBean;给bean的各种属性赋值
* 3)、initializeBean:初始化bean;
* 1)、invokeAwareMethods():处理Aware接口的方法回调
* 2)、applyBeanPostProcessorsBeforeInitialization():应用后置处理器的postProcessBeforeInitialization()
* 3)、invokeInitMethods();执行自定义的初始化方法
* 4)、applyBeanPostProcessorsAfterInitialization();执行后置处理器的postProcessAfterInitialization();
* 4)、BeanPostProcessor(AnnotationAwareAspectJAutoProxyCreator)创建成功;--》aspectJAdvisorsBuilder
* 7)、把BeanPostProcessor注册到BeanFactory中;
* beanFactory.addBeanPostProcessor(postProcessor);
* =======以上是创建和注册AnnotationAwareAspectJAutoProxyCreator的过程========
有点长,下一篇在说