spring容器中Bean生命周期

Isoke ·
更新时间:2024-09-20
· 777 次阅读

一、前言

1、指定初始化和销毁方法:
通过@Bean指定init-method和destroy-method
2、通过让Bean实现InitializingBean(自定义初始化逻辑),DisposableBean(自定义销毁逻辑)
3、可以使用JSR250:
@PostConstruct:在bean创建完成并且属性赋值完成后来执行初始化方法。
@PreDestroy:在容器销毁bean之前通知我们进行清理工作。
4、BeanPostProcessor【interface】:
bean的后置处理器:在bean初始化前后进行一些处理工作;
postProcessBeforeInitialization:初始化之前工作
postProcessAfterInitialization:初始化之后工作

二、代码示例

1、通过@Bean指定init-method和destroy-method
1.1、创建ColorBean 定义初始化和销毁方法

@Slf4j public class ColorBean { ColorBean(){ log.info("创建ColorBean...."); } public void initMethod(){ log.info("initMethod----ColorBean...."); } public void destroyMethod(){ log.info("destroyMethod----ColorBean...."); } }

1.2、创建配置列指定初始化和销毁方法

@Configuration public class ColorConfiguration { @Bean(initMethod ="initMethod",destroyMethod = "destroyMethod") public ColorBean colorBean(){ return new ColorBean(); } }

1.3、执行测试类验证

@RunWith(SpringRunner.class) @SpringBootTest @Slf4j public class JuniterTestColor { @Test public void testImportBean(){ AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(ColorConfiguration.class); ColorBean object1=(ColorBean)annotationConfigApplicationContext.getBean("colorBean"); annotationConfigApplicationContext.close(); } }

数据结果:

2020-04-11 16:00:31.764 INFO 108764 : 创建ColorBean.... 2020-04-11 16:00:31.768 INFO 108764 : initMethod----ColorBean.... 2020-04-11 16:00:31.774 INFO 108764 : destroyMethod----ColorBean....

2、通过让Bean实现InitializingBean(自定义初始化逻辑),DisposableBean(自定义销毁逻辑)
2.1在方法1的基础上

@Slf4j public class ColorBean implements InitializingBean { ColorBean(){ log.info("创建ColorBean...."); } public void initMethod(){ log.info("initMethod----ColorBean...."); } public void destroyMethod(){ log.info("destroyMethod----ColorBean...."); } @Override public void afterPropertiesSet() throws Exception { log.info("afterPropertiesSet----ColorBean...."); } }

继续执行测试类,输出结果:

2020-04-11 16:06:42.078 INFO 104956 : 创建ColorBean.... 2020-04-11 16:06:42.084 INFO 104956 : afterPropertiesSet----ColorBean.... 2020-04-11 16:06:42.084 INFO 104956 : initMethod----ColorBean.... 2020-04-11 16:06:42.088 INFO 104956 : destroyMethod----ColorBean....

afterPropertiesSet方法会先于@Bean指定的初始化方法。
3、可以使用JSR250:
@PostConstruct:在bean创建完成并且属性赋值完成后来执行初始化方法。
@PreDestroy:在容器销毁bean之前通知我们进行清理工作。

在2基础上继续添加

@Slf4j public class ColorBean implements InitializingBean { ColorBean(){ log.info("创建ColorBean...."); } public void initMethod(){ log.info("initMethod----ColorBean...."); } public void destroyMethod(){ log.info("destroyMethod----ColorBean...."); } @Override public void afterPropertiesSet() throws Exception { log.info("afterPropertiesSet----ColorBean...."); } @PostConstruct public void postConstructMethod(){ log.info("postMethod----ColorBean...."); } @PreDestroy public void preDestroyMethod(){ log.info("PreDestroy----ColorBean...."); } }

执行测试类,输出测试结果:

2020-04-11 16:16:34.902 INFO 104152: 创建ColorBean.... 2020-04-11 16:16:34.907 INFO 104152: postMethod----ColorBean.... 2020-04-11 16:16:34.908 INFO 104152: afterPropertiesSet----ColorBean.... 2020-04-11 16:16:34.908 INFO 104152: initMethod----ColorBean.... 2020-04-11 16:16:34.915 INFO 104152: PreDestroy----ColorBean.... 2020-04-11 16:16:34.915 INFO 104152: destroyMethod----ColorBean....

可以查看到各个方法执行顺序。

4、BeanPostProcessor【interface】:bean的后置处理器:在bean初始化前后进行一些处理工作;
postProcessBeforeInitialization:初始化之前工作
postProcessAfterInitialization:初始化之后工作

4.1MyBeanPostProcessor .java实现BeanPostProcessor

@Slf4j public class MyBeanPostProcessor implements BeanPostProcessor { public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { log.info("postProcessBeforeInitialization----"+beanName+"...."); return bean; } public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { log.info("postProcessAfterInitialization----"+beanName+"...."); return bean; } }

4.2MyBeanPostProcessor.java注册到IOC容器

@Configuration public class ColorConfiguration { @Bean(initMethod ="initMethod",destroyMethod = "destroyMethod") public ColorBean colorBean(){ return new ColorBean(); } @Bean public MyBeanPostProcessor myBeanPostProcessor(){ return new MyBeanPostProcessor(); } }

输出结果为:

2020-04-11 16:30:36.562 INFO 110052: 创建ColorBean.... 2020-04-11 16:30:36.565 INFO 110052: postProcessBeforeInitialization----colorBean.... 2020-04-11 16:30:36.566 INFO 110052: postMethod----ColorBean.... 2020-04-11 16:30:36.566 INFO 110052: afterPropertiesSet----ColorBean.... 2020-04-11 16:30:36.566 INFO 110052: initMethod----ColorBean.... 2020-04-11 16:30:36.566 INFO 110052: postProcessAfterInitialization----colorBean.... 2020-04-11 16:30:36.569 INFO 110052: PreDestroy----ColorBean.... 2020-04-11 16:30:36.569 INFO 110052: destroyMethod----ColorBean....

从测试结果可以看出
postProcessBeforeInitialization在初始化之前
postProcessAfterInitialization在初始化之后
了解Bean生命周期可以,让开发者对bean有更深入了解,在bean生命周期节点对bean进行特殊处理。例如数据库连接初始化和容器关闭时。


作者:曾令胜



spring bean

需要 登录 后方可回复, 如果你还没有账号请 注册新账号