借鉴: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 方法



















