Spring Bean的生命周期(钩子函数)
借鉴: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 方法
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!