Spring生命周期
一、Bean的初始化顺序(3个PostProcessor扩展接口)
总体顺序:
定义 --> 创建 --> 属性注入 --> 初始化
定义:最先执行,在所有Bean创建前可以获取到其元数据信息,如singlon 还是 prototype,以及有哪些属性
创建,属性注入,初始化:如没有依赖其他bean,则3个步骤在一起,一个bean 3个步骤执行完,再初始化其他bean
若有依赖其他bean ,会先创建,再初始化其他bean结束后再解决属性依赖注入(解决循环依赖)
1、所有实现BeanDefinitionRegistryPostProcessor的Bean优先初始化
2、所有实现BeanFactoryPostProcessor的Bean初始化
3、所有实现BeanPostProcessor的Bean初始化(若依赖普通Bean的话,普通Bean先初始化)
4、其他普通的Bean进行初始化
(销毁过程相反)
二、普通Bean生命周期
三、普通Bean自定义初始化方法和销毁方法
Bean在实例化的过程中: @PostConstruct -->InitializingBean --> init-method
Bean在销毁的过程中: @PreDestroy --> DisposableBean --> destroy-method
@PreDestroy某些场景不会调用:
a. scope="prototype” 每次调用产生一个实例,非IOC管理。不会调用
b. 实现BeanDefinitionRegistryPostProcessor和BeanFactoryPostProcessor的Bean销毁不会调用
四、接口使用总结
1、BeanPostProcessor.postProcessAfterInitialization 接口通常可用于发现并注册一些拦截器(因为所有的普通Bean都会执行此接口)
2、BeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry通常可以用于动态注册一些bean(除实现此接口的Bean外,所有Bean定义之后,创建之前,调用此接口)
五、初始化输出示例
1、BeanDefinitionRegistryPostProcessor优先初始化
BeanDefinitionRegistryPostProcessor1 construct invoked
BeanDefinitionRegistryPostProcessor1 afterPropertiesSet invoked
BeanDefinitionRegistryPostProcessor2 construct invoked
BeanDefinitionRegistryPostProcessor2 afterPropertiesSet invoked
BeanDefinitionRegistryPostProcessor1 postProcessBeanDefinitionRegistry invoked
BeanDefinitionRegistryPostProcessor2 postProcessBeanDefinitionRegistry invoked
BeanDefinitionRegistryPostProcessor1 postProcessBeanFactory invoked
BeanDefinitionRegistryPostProcessor2 postProcessBeanFactory invoked
----------------------------------------------------------------------------------------------
2、BeanFactoryPostProcessor初始化
BeanFactoryPostProcessor1 construct invoked
BeanFactoryPostProcessor1 afterPropertiesSet invoked
BeanFactoryPostProcessor2 construct invoked
BeanFactoryPostProcessor2 afterPropertiesSet invoked
BeanFactoryPostProcessor1 postProcessBeanFactory invoked
BeanFactoryPostProcessor2 postProcessBeanFactory invoked
----------------------------------------------------------------------------------------------
3、BeanPostProcessor初始化
BeanPostProcessor1 construct invoked
BeanPostProcessor1 postConstruct invoked
BeanPostProcessor1 afterPropertiesSet invoked
BeanPostProcessor2 construct invoked
BeanPostProcessor2 postConstruct invoked
BeanPostProcessor2 afterPropertiesSet invoked
----------------------------------------------------------------------------------------------
4、普通bean初始化(依次初始化)
如果两个Bean相互依赖,会先创建两个Bean(即调用构造方法),再进行初始化,以解决循环依赖问题
YfBean1 construct invoked
BeanPostProcessor1 postProcessBeforeInitialization invoked:yfBean1
BeanPostProcessor2 postProcessBeforeInitialization invoked:yfBean1
YfBean1 postConstruct invoked
YfBean1 afterPropertiesSet invoked
BeanPostProcessor1 postProcessAfterInitialization invoked:yfBean1
BeanPostProcessor2 postProcessAfterInitialization invoked:yfBean1
YfBean2 construct invoked
BeanPostProcessor1 postProcessBeforeInitialization invoked:yfBean2
BeanPostProcessor2 postProcessBeforeInitialization invoked:yfBean2
YfBean2 postConstruct invoked
YfBean2 afterPropertiesSet invoked
BeanPostProcessor1 postProcessAfterInitialization invoked:yfBean2
BeanPostProcessor2 postProcessAfterInitialization invoked:yfBean2
BeanPostProcessor1 postProcessBeforeInitialization invoked:org.springframework.boot.autoconfigure.data.rest.RepositoryRestMvcAutoConfiguration
BeanPostProcessor2 postProcessBeforeInitialization invoked:org.springframework.boot.autoconfigure.data.rest.RepositoryRestMvcAutoConfiguration
BeanPostProcessor1 postProcessAfterInitialization invoked:org.springframework.boot.autoconfigure.data.rest.RepositoryRestMvcAutoConfiguration
BeanPostProcessor2 postProcessAfterInitialization invoked:org.springframework.boot.autoconfigure.data.rest.RepositoryRestMvcAutoConfiguration
....
参考:https://www.jianshu.com/p/3944792a5fff