本文最后更新于:2024年4月22日 下午
堆栈分析简单的了解下Bean初始化的过程,以xxxAware为例分析,引出BeanPostProcessor的概念
准备工作
注意断点位置
堆栈追踪分析
堆栈分析
AnnotationConfigApplicationContext 构造函数
AbstractApplicationContext refresh()
refresh 会调用finishBeanFactoryInitialization 完成bean工厂的初始化
AbstractApplicationContext finishBeanFactoryInitialization()
beanFactory.preInstantiateSingletons() 初始化所有单实例bean ,这里是由 ConfigurableListableBeanFactory的子类**DefaultListableBeanFactory** 来实现
getBean 由父类AbstractBeanFactory 实现,并且会继续调用doGetBean
*AbstractBeanFactory doGetBean()
doGetBean 非常重要且这里的逻辑比较多,重点分析
这里面会调用到createBean() 来执行创建Bean
- AbstractAutowireCapableBeanFactory.createBean
- AbstractAutowireCapableBeanFactory.doCreateBean
- AbstractAutowireCapableBeanFactory.createBeanInstance
- AbstractAutowireCapableBeanFactory.instantiateBean
上面的执行链路来创建bean,instantiateBean 中会得到一个InstantiationStrategy 策略模式来得到一个创建bean的策略这里有两种实现
*** 重点 AbstractAutowireCapableBeanFactory 在doCreateBean 之后回去执行两个核心的方法
populateBean负责装配bean中其他的依赖对象
initializeBean 则负责**初始化Bean实例**
AbstractAutowireCapableBeanFactory.initializeBean
初始化中有个关键的方法applyBeanPostProcessorsAfterInitialization
AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization
而applyBeanPostProcessorsAfterInitialization 会将所有的 BeanPostProcessor 拿取出来进行执行
ApplicationContextAwareProcessor .postProcessBeforeInitialization 继而invokeAwareInterfaces
至此,这里执行的arare 这个BeanPostProcessor的接口回调。
整体流程下来,也就是为什么我们Bean实现 了xxxAware,就能给我们的组件注入相关对象。
后续章节会细细讲解
整体的流程图
后续
这里我们了解了Aware 的实现方式,同时也引出了一个新的概念 BeanPostProcessor
Bean的功能增强全部都是BeanPostProcessor+InitializingBean 这两个特性来实现的,包括AOP、事务、通知、WEB等功能基本上全是这样来搞出来的,后续章节会一一揭开它们的面纱