借鉴:https://www.cnblogs.com/liweimingbk/p/17843970.html
https://blog.csdn.net/lxz352907839/article/details/128634404
一、Spring Bean生命周期
如果Spring配置文件中所定义的Bean类实现了ApplicationContextAware 接口,那么在加载Spring配置文件时,会自动调用ApplicationContextAware 接口中的setApplicationContext,自动的将ApplicationContext注入进来。
二:Bean 实例加载阶段
1、BeanFactory 容器类型
钩子执行顺序与博文顺序一致,即 1->n
1)、@PostConstruct
2)、InitializingBean
3)、init-method
4)、@PreDestroy
5)、DisposableBean
6)、destroy-method
2、ApplicationContext 容器类型
1)、AbstractApplicationContext#initPropertySources
2)、AbstractApplicationContext 其他可被子类重写的方法
3)、BeanNameAware
4)、BeanClassLoaderAware
5)、ApplicationContextAware
6)、其他类型 Aware
7)、AbstractApplicationContext#postProcessBeanFactory
8)、执行注册的 BeanFactoryPostProcessor#postProcessBeanDefinitionRegistry
9)、AbstractApplicationContext#onRefresh
10)、广播 earlyApplicationEvents(容器启动就发布的事件)
11)、配置 Converter<S, T>
12)、初始化 bean 之前执行 BeanPostProcessor#postProcessBeforeInitialization
9)、@PostConstruct
10)、InitializingBean
11)、init-method
12)、初始化 bean 后执行 BeanPostProcessor#postProcessAfterInitialization
12)、程序执行中触发的 ApplicationListener
8)、@PreDestroy
9)、DisposableBean
10)、destroy-method
使用 ApplicationContext.registerShutdownHook() 关闭钩子,让销毁回调函数自动触发
三:Spring框架预留的钩子函数(接口)和方法
spring详细加载全过程如下:
调用 BeanNameAware 的 setBeanName 方法
调用 BeanFactoryAware 的 setBeanFactory 方法
调用 ApplicationContextAware 的 setApplicationContext
调用 InitializingBean 的 afterPropertiesSet 或者没有实现这个接口,但指定了@Bean(initMethod=“不加括号的方法名”),会执行这个方法
调用 BeanPostProcessor 的 postProcessBeforeInitialization 方法
调用 BeanPostProcessor 的 postProcessAfterInitialization 方法
Bean 初始化完成,可以被使用
容器关闭前,调用 DisposableBean 的 destroy 方法