app开发者平台在数字化时代的重要性与发展趋势解析
953
2022-12-19
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小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~