1. 目录
- Spring中Bean的生命周期
- 注册BeanPostProcessor
- BeanFactory.getBean()(注册Bean)
- createBean()
- resolveBeforeInstantiation
- InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation()
- BeanPostProcessor.postProcessAfterInitialization()
- 这里调用postProcessAfterInitialization 有啥用??
- doCreateBean() 创建bean
- createBeanInstance 创建实例
- populateBean 设置Bean属性
- InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation
- initializeBean 初始化方法
- 处理BeanNameAware、BeanClassLoaderAware、BeanFactoryAware
- applyBeanPostProcessorsBeforeInitialization
- invokeInitMethods
- applyBeanPostProcessorsAfterInitialization
- resolveBeforeInstantiation
- getSingleton(String beanName, ObjectFactory<?> singletonFactory)
- createBean()
- registerBeanPostProcessors
- BeanFactory.getBean()(注册Bean)
- ApplicationContextAware 在哪被调用?
- 多个BeanPostProcessor,先注册的会不会对后面注册的BeanPostProcessor起作用?
- InstantiationAwareBeanPostProcessor应用——AOP
- 创建AOP
- @EnableAspectJAutoProxy
- AnnotationAwareAspectJAutoProxyCreator
- InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation
- 创建目标对象
- InstantiationAwareBeanPostProcessor.postProcessAfterInitialization(initializeBean()中的)
- wrapIfNecessary()包装Bean
- 什么时候注册的增强器??
- AspectJPointcutAdvisor 是干什么的??
- 执行AOP目标方法
- 获取拦截器链
- 递归调用拦截器
- 创建AOP
- 总结
2. 流程图
代码流程可参见 spirng 流程图
3. spring中bean生命周期
Spring作为一个优秀的框架,拥有良好的可扩展性。Spring对对象的可扩展性主要就是依靠InstantiationAwareBeanPostProcessor
和BeanPostProcessor
来实现的。
* InstantiationAwareBeanPostProcessor 主要是作用于实例化阶段。
* BeanPostProcessor 主要作用与 初始化阶段。
1 | public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) { |
applicationContext构造方法中调用refresh()方法
refresh() 方法中这里主要关心两个方法
registerBeanPostProcessors(beanFactory)
; 注册BeanPostProcessor
finishBeanFactoryInitialization(beanFactory)
; 注册余下的Singletions Bean
4. 注册BeanPostProcessor
1 | //BeanPostProcessor按优先级分为PriorityOrdered,Ordered和其他的,对他们分别进行操作。 |
BeanPostProcessor
按优先级分为PriorityOrdered
,Ordered
和其他的,对他们分别进行操作。
- 先
beanFactory.getBean
进性实例化, - 再使用
sortPostProcessors()
进行排序, - 最后
registerBeanPostProcessors()
进行注册。
4.1 BeanFactory.getBean()(注册Bean)
1 | protected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType, |
- 先getSingleton()从缓存中获取Bean,如果没有则创建。
- 创建过程先检查有无循环依赖,有则抛出异常。
- 实例化bean前先实例化所依赖的对象。
4.1.1 createBean()
1 |
|
resolveBeforeInstantiation()
在doCreateBean()
之前调用,使用InstantiationAwareBeanPostProcessor
,在Bean被创建之前处理。
4.1.1.1 resolveBeforeInstantiation
1 | protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) { |
4.1.1.1.1 InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation()
1 | protected Object applyBeanPostProcessorsBeforeInstantiation(Class<?> beanClass, String beanName) { |