spring中通常使用的是ApplicationContext
来看看ApplicationContext的生命周期中,有没有什么地方可以扩展
如果使用的注解ApplicationContext, 则在new时触发构造函数,加载spring内部的注解扫描;
整个Application的初始化是在AbstractApplicationContext.refresh()方法.
一、prepareRefresh()
刷新前的准备 加载PropertySource 可扩展点 propertySource
1、继承/实现 Enviroment, 并在customizePropertySources方法 加入自己想配置的propertySource
2、继承ApplicationContext 并实现initPropertySources, 添加自己的propertySource
3、在ApplicationContext refresh前获取enviroment,并添加propertySource
二、obtainFreshBeanFactory()
获取beanFactory,没有扩展点
三、prepareBeanFactory(beanFactory)
准备beanFacoty的配置
1、指定classLoader
2、指定SpEL
3、指定属性编辑注册器ProperytEditorRegistrar
4、指定预先beanPostProcessor, 如各种aware织入处理,包括ApplicationContextAwareProcessor(用于处理自定义bean织入ApplicationContext)
ApplicationListenerDetector(用于提早发现bean定义的监听器)
5、注册特殊依赖,和排除特殊依赖
6、检查是否有类加载织入
7、注册特殊bean,如environment, jvm配置参数,系统配置参数
通过以上生命以及代码的声明方式,可以扩展的有
1、在refresh前,获取beanFactory,并添加beanPostProcessor,这样添加的beanProstProcessor比一般的beanProstProcessor能早处理
四、postProcessBeanFactory(beanFactory)
处理beanFactory, 默认什么都没触发
五、invokeBeanFactoryPostProcessors(beanFactory)
- 首先初始化并按顺序批次触发所有BeanDefinitionRegistryPostProcessor(BeanDefinitionRegistryPostProcessor是BeanFactoryPostProcessor的子接口)
- 这里包括处理@Configuration/@Component/@Import/@ImportResource/@ComponentScan的BeanDefinition加载注册/解析,并一起处理一下步骤
- 包括类启动类上注释的其他注解,以及注解里引入的注解如@Import,@ComponentScan等
- 包括类/注解类上声明的@ImportSelector(如spring-boot的执行AutoConfigrationImportSelector类的getAutoConfigurationEntry方法加载所有spring.factories的EnableAutoConfiguration)beanDefinition加载注册
这里是给BeanFacotyPostProcessor触发的机会的,当然也可以实现BeanFacotyPostProcessor来干别的事情
比如PropertyPlaceholderConfiger实现了BeanFactoryPostProcessor处理占位符
- 这里包括处理@Configuration/@Component/@Import/@ImportResource/@ComponentScan的BeanDefinition加载注册/解析,并一起处理一下步骤
- BeanDefinitionRegistryPostProcessor会被多次执行,一次是参数传递,一次是查询,还有一次是上一次查询附加查询出来的BeanDefinitionRegistryPostProcessor
- 然后初始化并按顺序批次触发所有BeanFactoryPostProcessor, 一样的会被执行多次
六、registerBeanPostProcessors(beanFactory)
注册beanPostProcessor, 即所有BeanPostProcessor的扩展
七、initMessageSource ()
初始化国际化相关
八、initApplicationEventMulticaster()
初始化事件分发相关
九、onRefresh()
默认空实现,ApplicationContext的子类可以实现该方法,做自己特殊bean的初始化等。
十、registerListeners()
注册spring事件监听器,并广播可能的事件。 继承ApplicationListener即可实现自己的监听。
因为走到这一步,应用已经刷新,即无法实现应用启动前,启动中的事件监听。
spring-boot封装SpringApplicationRunListener, 并封装SpringAppliction的引导启动流程,能在Spring的启动过程中发出各个事件, 详情请看spring-boot启动
十一、finishBeanFactoryInitialization(beanFactory)
初始化非延迟实例化的单例
十二、finishRefresh()
结束刷新, 对bean生命周期监视。发送刷新完毕事件. 监视存活的bean(MBean)如果有必要