Bean的生命周期
Bean的生命周期
bean创建-->初始化-->销毁
容器管理Bean的生命周期
我们可以自定义初始化和销毁方法,容器在bean进行到当前生命周期的时候来调用我们自定义的初始化和销毁方法
-
创建(对象创建)
单实例:在容器启动的时候创建
多实例:在每次获取的时候创建
-
初始化
对象创建完成,并赋值好,调用初始化方法
-
销毁
单实例bean在容器关闭的时候销毁
多实例bean容器不会调用销毁,这时候可以手动来调用销毁方法
1. 指定初始化和销毁方法:
通过@Bean注解指定init-method和destory-method
要被注入的bean类Car
@Component
public class Car {
public Car(){
System.out.println("car constructor---");
}
//初始化里可以进行一系列操作,如属性赋值
public void init(){
System.out.println("car init---");
}
//销毁里可以进行比如连接数据源的关闭等等
public void destroy(){
System.out.println("car destory---");
}
}
配置类:指定了初始化方法initMethod = "init"和销毁方法destroyMethod = "destroy"
@Configuration
public class BeanConfigOfLifeCycle {
@Bean(initMethod = "init", destroyMethod = "destroy")
public Car car(){
return new Car();
}
}
测试方法
public class IOCTestLifeCycle {
@Test
public void test01() {
//1、ioc容器的创建
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(BeanConfigOfLifeCycle.class);
System.out.println("容器创建完成---");
//关闭容器
applicationContext.close();
}
}
运行结果
car constructor---
car init---
容器创建完成---
car destory---
2. 通过实现接口的方式
让Bean实现Spring提供的InitializingBean(定义初始化逻辑)接口和 DisposableBean(定义销毁逻辑)接口
@Component
public class Cat implements InitializingBean, DisposableBean {
public Cat(){
System.out.println("car constructor---");
}
@Override
public void destroy() throws Exception {
System.out.println("cat destory---");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("cat afterPropertiesSet---");
}
}
3. 使用JSR250
@PostConstruct:在bean创建完成并且属性赋值完成之后来执行初始化方法
@PreDestroy:在容器销毁bean之前通知我们进行清理工作
@Component
public class Dog implements ApplicationContextAware {
public Dog(){
System.out.println("dog constructor---");
}
/**
* 对象创建并赋值之后调用
*/
@PostConstruct
public void init(){
System.out.println("dog postConstructor---");
}
/**
* 在容器移除对象之前调用
*/
@PreDestroy
public void preDestroy(){
System.out.println("dog preDestroy---");
}
}
4. 使用Bean的后置处理器
BeanPostProcessor接口:bean的后置处理器,在bean初始化前后进行一些处理工作
postProcessBeforeInitialization:在初始化之前工作
postProcessAfterInitialization:在初始化之后工作
自定义的BeanPostProcessor还可以实现Ordered接口进行自定义排序
public class MyBeanPostProcessor implements BeanPostProcessor, Ordered {
/**
* 在所有其他初始化操作(Bean指定、实现、JSR250)之前执行处理
* @param bean
* @param beanName
* @return
* @throws BeansException
*/
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessBeforeInitialization---"+beanName+"---");
return bean;
}
/**
* 在所有初始化之后操作之后执行处理
* @param bean
* @param beanName
* @return
* @throws BeansException
*/
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessAfterInitialization---"+beanName+"---");
return bean;
}
@Override
public int getOrder() {
return 0;
}
}
配置类:@Import注入MyBeanPostProcessor
@Configuration
@Import(MyBeanPostProcessor.class)
public class BeanConfigOfLifeCycle {
@Bean(initMethod = "init", destroyMethod = "destroy")
public Car car(){
return new Car();
}
}
测试方法:
public class IOCTestLifeCycle {
@Test
public void test01() {
//1、ioc容器的创建
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(BeanConfigOfLifeCycle.class);
System.out.println("容器创建完成---");
//关闭容器
applicationContext.close();
}
}
运行结果
car constructor---
postProcessBeforeInitialization---car---
car init---
postProcessAfterInitialization---car---
容器创建完成---
car destory---