SpringBoot中的Bean的初始化与销毁顺序解析

网友投稿 402 2022-10-05


SpringBoot中的Bean的初始化与销毁顺序解析

我今天学习到SpringBoot里面自定义Bean的初始化与销毁方法

我先总结一下我学到的四种方法:

方法一:

指定init-method 和 destory-method

方法二:

通过让 Bean 实现 InitializingBean 接口,定义初始化逻辑

DisposableBean 接口,定义销毁逻辑

方法三:

用 @PostConstruct,在 Bean 创建完成并且赋值完成后,执行该注解标注的方法

@PreDestroy,在容器销毁 Bean 之前,执行该注解标注的方法

方法四:

通过让 Bean 实现 BeanPostProcessor 接口,在Bean 初始化前后进行一些处理工作

postProcessBeforeInitialization: 在初始化之前工作

postProcessAfterInitialization: 在初始化之后工作

然后我就在想它们的执行顺序是怎样的:

尝试一:

配置类:

//告诉Spring这是一个配置类

@Configuration

public 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 stub

System.out.println(" .. DisposableBean ..");

}

//该Bean创建完成并且赋值完成后,调用

public void afterPropertiesSet() throws Exception {

// TODO Auto-generated method stub

System.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 stub

System.out.println(" .. postProcessBeforeInitialization .. ");

return bean;

}

@Override

public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {

// TODO Auto-generated method stub

System.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 是顺序的,所有不能确定这次结果是否准确。

尝试二:我把上面四种方法都杂糅到一个类里

配置类:

@Configuration

public 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 clasSXOtees IOCTest_LifeCycle {

@Test

public void test01() {

// 1. 创建IOC容器

AnnotationConfigApplicationContext applicationContext = new Annotatiohttp://nConfigApplicationContext(MainConfigOfLifeCycle.class);

System.out.println("容器创建完成");

// 关闭容器

applicationContext.close();

}

}

执行结果:

总结:

创建:

Bean 构造函数 ——> @PostConstruct ——> InitializingBean 接口 ——> bean 定义的 init-method——> postProcessBeforeInitialization ——> Bean http://初始化完成 ——> postProcessAfterInitialization ——> 容器创建完成

销毁:

@PreDestroy ——> DisposableBean 接口 ——> bean 定义的 destoryMethod ——> Bean销毁


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:【网络安全学习教程】专业人士必知的渗透测试工具!(网络安全法 渗透测试)
下一篇:第三季度全球DDoS 攻J增长44%,DDos 攻J影响究竟有多大(第三季度全球gdp)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~