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

 

posted @ 2020-05-13 23:17  蓝天随笔  阅读(218)  评论(0编辑  收藏  举报