SpringBoot中的Bean的初始化与销毁顺序解析
我今天学习到SpringBoot里面自定义Bean的初始化与销毁方法
我先总结一下我学到的四种方法:
方法一:
指定init-method 和 destory-method
方法二:
通过让 Bean 实现 InitializingBean 接口,定义初始化逻辑
DisposableBean 接口,定义销毁逻辑
方法三:
用 @PostConstruct,在 Bean 创建完成并且赋值完成后,执行该注解标注的方法
@PreDestroy,在容器销毁 Bean 之前,执行该注解标注的方法
方法四:
通过让 Bean 实现 BeanPostProcessor 接口,在Bean 初始化前后进行一些处理工作
- postProcessBeforeInitialization: 在初始化之前工作
- postProcessAfterInitialization: 在初始化之后工作
尝试一: 配置类:
//告诉Spring这是一个配置类@Configurationpublic class MainConfigOfLifeCycle { //利用 init-method 和 destory-method @Bean(initMethod="initTest", destroyMethod="detoryTest") public Car car() {return new Car(); } //实现 InitializingBean , DisposableBean 接口 @Bean public Cat cat() {return new Cat(); } //利用 @PostConstruct ,@PreDestroy @Bean public Dog dog() {return new Dog(); } //实现 BeanPostProcessor 接口 @Bean public MyBeanPostProcessor myBeanPostProcessor() {return new MyBeanPostProcessor(); } }
4个 bean:
public class Car{ public void initTest() {System.out.println(" .. init-method .. "); } public void detoryTest() {System.out.println(" .. destory-method .. "); }}public class Cat implements InitializingBean, DisposableBean { //该Bean在销毁时,调用 public void destroy() throws Exception {// TODO Auto-generated method stubSystem.out.println(" .. DisposableBean .."); } //该Bean创建完成并且赋值完成后,调用 public void afterPropertiesSet() throws Exception {// TODO Auto-generated method stubSystem.out.println(" .. InitializingBean .."); } }public class Dog { //对象创建并赋值之后调用 @PostConstruct public void init() {System.out.println(" .. @PostConstruct .. "); } //容器移除对象之前 @PreDestroy public void detory() {System.out.println(" .. @PreDestroy .. "); } }public class MyBeanPostProcessor implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {// TODO Auto-generated method stubSystem.out.println(" .. postProcessBeforeInitialization .. "); return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {// TODO Auto-generated method stubSystem.out.println(" .. postProcessBeforeInitialization .. "); return bean; } }
运行:
public class IOCTest_LifeCycle { @Test public void test01() {// 1. 创建IOC容器AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfLifeCycle.class); System.out.println("容器创建完成"); // 关闭容器applicationContext.close(); } }
执行结果:
文章图片
思考:发现容器在加载 Bean 时是顺序的,因为我在MainConfigOfLifeCycle这个配置类里 @Bean 是顺序的,所有不能确定这次结果是否准确。
尝试二:我把上面四种方法都杂糅到一个类里 配置类:
@Configurationpublic class MainConfigOfLifeCycle { @Bean(initMethod="initTest", destroyMethod="detoryTest") public Car car() {return new Car(); }}
Bean:
public class Car implements InitializingBean, DisposableBean, BeanPostProcessor { public Car() {System.out.println("Car 创建"); } public void initTest() {System.out.println(" .. init-method .. "); } public void detoryTest() {System.out.println(" .. destory-method .. "); } @Override public void afterPropertiesSet() throws Exception {System.out.println(" .. InitializingBean .. "); } @Override public void destroy() throws Exception {System.out.println(" .. DisposableBean .. "); } @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {System.out.println(" .. postProcessBeforeInitialization .. "); return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {System.out.println(" .. postProcessAfterInitialization .. "); return bean; } @PostConstruct public void postConstructTest() {System.out.println(" .. @PostConstruct .. "); } @PreDestroy public void preDestroyTest() {System.out.println(" .. @PreDestroy .. "); } }
运行:
public class IOCTest_LifeCycle { @Test public void test01() {// 1. 创建IOC容器AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfLifeCycle.class); System.out.println("容器创建完成"); // 关闭容器applicationContext.close(); } }
执行结果:
文章图片
总结: 创建:
- Bean 构造函数 ——> @PostConstruct ——> InitializingBean 接口 ——> bean 定义的 init-method——> postProcessBeforeInitialization ——> Bean 初始化完成 ——> postProcessAfterInitialization ——> 容器创建完成
- @PreDestroy ——> DisposableBean 接口 ——> bean 定义的 destoryMethod ——> Bean销毁
推荐阅读
- 热闹中的孤独
- JS中的各种宽高度定义及其应用
- Activiti(一)SpringBoot2集成Activiti6
- 我眼中的佛系经纪人
- 《魔法科高中的劣等生》第26卷(Invasion篇)发售
- Android中的AES加密-下
- 放下心中的偶像包袱吧
- C语言字符函数中的isalnum()和iscntrl()你都知道吗
- SpringBoot调用公共模块的自定义注解失效的解决
- C语言浮点函数中的modf和fmod详解