ClassPathXmlApplicationContext#refresh流程
1. 准备context: prepareRefresh()
do:
-
设置
属性 值 startupDate System.currentTimeMillis() closed false active true -
初始化所有占位符属性源
-
验证被标记为
required
的属性是否可解析 -
初始化
属性 值 applicationListeners applicationListeners earlyApplicationEvents LinkedHashSet
2. refresh BeanFactory: ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory()
如果已经初始化BeanFactory:
- destroy beans
- close BeanFactory
do:
-
实例化BeanFactory
-
设置serializationId
-
自定义处理
属性 值 allowBeanDefinitionOverriding allowCircularReferences -
加载
<bean>
,解析为BeanDefinition
3. 准备BeanFactory: prepareBeanFactory(beanFactory)
do:
-
set: Bean ClassLoader, Bean ExpressionResolver, Property EditorRegistrar
-
添加BeanPostProcessor: ApplicationContextAwareProcessor, ApplicationListenerDetector
-
ignore dependencyInterface
-
register resolvableDependency
-
注册单例:environment, systemProperties, systemEnvironment
4. 【扩展接口】postProcessBeanFactory
允许子容器注册特殊的BeanPostProcessor
5. 调用BeanFactory PostProcessor
实现BeanFactoryPostProcessor接口,有一个方法postProcessBeanFactory,作用:操作BeanFactory
实现BeanDefinitionRegistryPostProcessor接口,新增了一个方法postProcessBeanDefinitionRegistry,可以注册BeanDefinition
do:执行顺序PriorityOrdered > Ordered > 无
- 先执行
BeanDefinitionRegistryPostProcessor#postProcessBeanDefinitionRegistry
- 后执行
BeanDefinitionRegistryPostProcessor#postProcessBeanFactory
- 最后执行
BeanFactoryPostProcessor#postProcessBeanFactory
6. 注册Bean PostProcessor
do:注册顺序PriorityOrdered > Ordered > 无
- 注册Bean PostProcessor
7. 初始化Message Source
注册单例 messageSource
8. 初始化事件multicaster
注册单例 applicationEventMulticaster
9. 【扩展接口】onRefresh
允许子容器在实例化单例前,初始化特殊的Bean
10. 注册监听器
11. 实例化非懒加载的单例Bean
11.1 生命周期
- 实例化
- 属性填充
- 初始化
- Aware接口
- BeanNameAware#setBeanName
- BeanClassLoaderAware#setBeanClassLoader
- BeanFactoryAware#setBeanFactory
- 后置处理器前置处理
- InitializingBean#afterPropertiesSet
- 自定义初始化方法
- 后置处理器后置处理
- Aware接口
- 【使用】
- 销毁容器
- DisposableBean#destroy
- destroy-method属性指定方法
11.2 循环依赖
场景:a和b循环依赖
- a实例化进三级缓存,属性填充b
- b实例化进三级缓存,属性填充a
- 一级和二级缓存没有,三级缓存有
- a从三级缓存移动到二级缓存:早期暴露,此处可能进行AOP代理
- 获取a
- b创建完从三级缓存移动到一级缓存
- 继续a属性填充,初始化,若早期暴露创建了proxy则从缓存取出代理替换当前target,然后移动到一级缓存
12. 完成refresh
- 清除resourceCaches
- 初始化LifecycleProcessor
- 传播refresh给LifecycleProcessor
- 发布ContextRefreshedEvent事件
- …
小结
- 实例化BeanFactory
- 加载xml配置为BeanDefinition
- 调用BeanFactory后置处理器
- 注册Bean后置处理器
- 实例化非懒加载单例Bean
- 查缓存
- 实例化
- 属性填充
- 初始化