Spring Bean Lifecycle
1 过程
1)调用无参构造
2)执行 set 方法设置属性
也可以是 @Bean 注解方法内容
3)调用 BeanNameAware 的 setBeanName 方法
可以获得 Bean 的名字
4)调用 BeanClassLoaderAware 的 setBeanClassLoader 方法
可以获得 ClassLoader 对象的实例
5)调用 BeanFactoryAware 的 setBeanFactory 方法
可以获得 BeanFactory,主要用来检测作用域
6)调用 EnvironmentAware 的 setEnviroment 方法
可以获得当前环境下所有配置解析
7)调用 EmbeddedValueResolverAware 的 setEmbeddedValueResolver 方法
设置配置解析器
8)调用 ResourceLoaderAware 的 setResourceLoader 方法
可以获得当前加载的所有资源文件
9)调用 ApplicationEventPublisherAware 的 setApplicationEventPublisher 方法
可以获得所有上下文的发布事件
10)调用 MessageSourceAware 的 setMessageSource 方法
处理 MessageSource 类型的 Bean
11)调用 ApplicationContextAware 的 setApplicationContext 方法
可以获得上下文对象,主要获取所有 Bean的名字
12)调用 ServletContextAware 的 setServletContext 方法
实现该方法,可以使用 ServletContext 来执行自己想要的操作。
13)执行 BeanPostProcessor 的 postProcessBeforeInitialization 方法
在每一个 Bean 初始化之前执行的方法(有多少 Bean 调用多少次)
14)执行标注 @PostConstruct 注解的方法
一般标注在 init 方法上,表示初始化方法)
15)执行 InitializingBean 的 afterPropertiesSet 方法
在『当前 Bean 』的属性设置之后才会进行调用(设置 Bean 的属性包括:@Value,@Resource 等)
某个 Bean 的 afterPropertiesSet 方法执行完毕,才会执行下一个 Bean 的 afterPropertiesSet 方法,依据实例化顺序来算。
16)执行配置的 init-method
配置指定的初始化方法
底层使用反射实现
17)执行 BeanPostProcessor 的 postProcessAfterInitialization 方法
在所有 Bean 初始化之后执行的方法(有多少 Bean 调用多少次)
2 额外注意
SmartInitializingSingleton
所有非lazy单例 Bean 加载完成后的回调方法,不是初始化完成,而是加载完成
ApplicationListener
最后调用 onApplicationEvent方法,因为 onApplicationEvent 会被频繁执行,基于观察者模式,需要使用它监听,必须要考虑性能问题。每当在一个 ApplicationEvent 发布到 ApplicationContext 时,这个 Bean 会到通知。 作者:沉默的反补 https://www.bilibili.com/read/cv5926940/ 出处:bilibili