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进行特殊处理。例如数据库连接初始化和容器关闭时。