Spring注解学习_AOP原理2_注册AnnotationAwareAspectJAutoProxyCreator的过程
¶注册后置处理器AnnotationAwareAspectJAutoProxyCreator的过程
AnnotationAwareAspectJAutoProxyCreator自身也是一个后置处理器,从容器启动到AnnotationAwareAspectJAutoProxyCreator被注册到容器的全过程如下:
-
代创建ioc容器,通过构造参数形式传入配置类
-
注册配置类,调用refresh()方法刷新容器
-
refresh()中调用registerBeanPostProcessors( beanFactory ) :注册bean后置处理器来拦截bean的创建,我们看看registerBeanPostProcessors 方法的具体流程:
-
先获取ioc容器中 已定义了的 需要创建的 所有BeanPostProcessor

-
后置处理器信息中就包括了我们之前讲的 “internalAutoProxyCreator”:AnnotationAwareAspectJAutoProxyCreator
-
后续还会给容器中加上一些其他的BeanPostProcessor:

-
之后在根据BeanPostProcessor的优先级,将它们添加到相应优先级的ArrayList当中(其中PriorityOrdered、Ordered都为空接口,优先级:PriorityOrdered>Ordered>普通)

-
然后就是注册BeanPostProcessor:优先注册实现了PriorityOrdered接口的BeanPostProcessor,然后是实现了Ordered接口的,最后是没有实现优先级接口的BeanPostProcessor
-
注册BeanPostProcessor,实际就是创建BeanPostProcessor对象,保存在容器中。其中包括本次分析的目标对象:AnnotationAwareAspectJAutoProxyCreator
后置处理器本身也是Bean,注册到容器的流程和普通Bean一样:
-
创建Bean实例
-
populateBean( beanName, mbd, instanceWrapper ); 给Bean的各种属性赋值
-
initializeBean 初始化Bean
- invokeAwareMethod() : 处理Aware接口的方法回调
- applyBeanPostProcessorsBeforeInitialization() : 应用后置处理器的初始化前处理
- invokeInitMethods() : 执行自定义的初始化方法
- applyBeanPostProcessorsAfterInitialization() : 应用后置处理器的初始化后处理
-
BeanPostProcessor【AnnotationAwareAspectJAutoProxyCreator】创建成功,且由于实现了BeanFactoryAware接口,其setBeanFactory方法被调用,(此方法会调用initBeanFactory,进而创建新的ReflectiveAspectJAdvisorFactory对象。)

-
把BeanPostProcessor注册到BeanFactory中:beanFactory.addBeanPostProcessor( postProcessor );
-
以后任何组件在创建Bean实例的时候,AnnotationAwareAspectJAutoProxyCreator 就可以其后置处理器的身份拦截到这些Bean的创建过程。
-
-
finishBeanFactoryInitialization( beanFactory ) ; 完成BeanFactory的初始化工作,创建剩下的单实例Bean
【AnnotationAwareAspectJAutoProxyCreator会在所有Bean创建之前进行拦截,它实现了InstantiationAwareBeanPostProcessor接口,会调用postProcessBeforeInstantiation方法】
-
遍历获取容器中所有的beanDefinition,依次创建对象getBean( beanName )
getBean() --调用–> doGetBean() --调用–> getSingleton() : 先检查有无已创建单实例,有则直接获取,无则创建。只要创建好的Bean都会被缓存起来
-
通过AbstractAutowireCapableBeanFactory类下的:createBean() 创建Bean,流程为:
-
resolveBeforeInstantiation(beanName, mbdToUse);
在doCreateBean()之前会给后置处理器们一次机会,希望返回代理对象,若有代理对象则视为成功创建Bean,返回该代理对象。
-
后置处理器先尝试返回对象
bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
拿到所有的后置处理器,如果是InstantiationAwareBeanPostProcessor,就该执行后置处理器的 postProcessBeforeInstantiation(beanClass, beanName) 方法

而AnnotationAwareAspectJAutoProxyCreator正是InstantiationAwareBeanPostProcessor ,故此方法生效。
-
postProcessBeforeInstantiation(beanClass, beanName)
-
-
doCreateBean(beanName, mbdToUse, args):就是Bean的创建流程——创建Bean实例,赋值,初始化(执行Aware接口方法,后置处理器们的初始化前处理,初始化方法,后置处理器们的初始化后处理)
-
-
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达,邮件至 708801794@qq.com
文章标题:Spring注解学习_AOP原理2_注册AnnotationAwareAspectJAutoProxyCreator的过程
文章字数:754
本文作者:梅罢葛
发布时间:2020-04-06, 22:30:25
最后更新:2020-04-06, 22:35:23
原始链接:https://qiurungeng.github.io/2020/04/06/Spring%E6%B3%A8%E8%A7%A3%E5%AD%A6%E4%B9%A0-AOP%E5%8E%9F%E7%90%862-%E6%B3%A8%E5%86%8CAnnotationAwareAspectJAutoProxyCreator%E7%9A%84%E8%BF%87%E7%A8%8B/