经过上篇文章完成了 AnnotationAwareAspectJAutoProxyCreator
的注册以及创建,本篇文章主要分析该后置处理器注册创建后所完成的功能。
参考资料
源码分析
继承关系图
1、传入配置类,创建 IOC 容器
IOCTest_AOP#test01()
2、注册配置类,调用 refresh()
刷新容器
AnnotationConfigApplicationContext#AnnotationConfigApplicationContext()
AbstractApplicationContext#refresh()
finishBeanFactoryInitialization()
完成 BeanFactory 初始化工作,注册剩下的单实例 Bean。
3、完成 BeanFactory 初始化工作流程详解
创建 Bean 的流程和上篇文章中的过程类似。
3.1、遍历获取容器中所有的 Bean,依次创建对象
调用流程:
DefaultListableBeanFactory#preInstantiateSingletons()
AbstractBeanFactory#getBean()
AbstractBeanFactory#doGetBean()
DefaultListableBeanFactory#preInstantiateSingletons()
AbstractBeanFactory#getBean()
AbstractBeanFactory#doGetBean()
3.2、创建 Bean(分析 AbstractBeanFactory#doGetBean()
)
3.2.1、先从缓存中获取当前 Bean
如果能获取到,说明 Bean 是之前被创建过的,直接使用,否则再创建。(只要创建好的 Bean 都会被缓存起来。)
3.2.2、创建 Bean
AbstractAutowireCapableBeanFactory#createBean()
resolveBeforeInstantiation()
希望后置处理器在此能返回一个代理对象,如果能返回代理对象就使用,如果不能就继续往下走流程。
此处 doCreateBean()
和上篇文章 3.5 的过程一致,在此就不再赘述了。
AbstractAutowireCapableBeanFactory#resolveBeforeInstantiation()
主要有两个方法:
applyBeanPostProcessorsBeforeInstantiation
applyBeanPostProcessorsAfterInitialization
applyBeanPostProcessorsBeforeInstantiation
方法中判断了当前 Bean 是否是 InstantiationAwareBeanPostProcessor
类型。
需要注意这里的判断:
BeanPostProcessor
是在 Bean 对象创建完成初始化前后调用的。InstantiationAwareBeanPostProcessor
是在创建 Bean 实例之前先尝试用后置处理器返回对象的。
上面两个都是后置处理器,但是调用的时机不同。
AnnotationAwareAspectJAutoProxyCreator
父类也实现了 InstantiationAwareBeanPostProcessor
,因此会在任何 Bean 创建之前先尝试返回 Bean 的实例(对应 3.2.1 的方法)。
综上,AnnotationAwareAspectJAutoProxyCreator
在所有 Bean 创建之前会有一个拦截,会调用 postProcessBeforeInstantiation()
方法。