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