Bean的生命周期
Bean的生命周期就是bean的建立、初始化、銷毀的整個過程。可以指定Bean的生命周期的方法,添加自定義邏輯,進行到Bean的生命周期的相關階段時,就會調用我們相關的生命周期的方法。
Bean的建立:
- 單執行個體:在IOC容器建立的時候,就建立了執行個體對象。
- 多執行個體:在每次從容器中擷取Bean的時候建立對象。
Bean的初始化:
- 單執行個體:對象建立完成,并指派好屬性初始化值,調用初始化方法
- 多執行個體:調用bean的時候,建立對象,并調用初始化方法
Bean銷毀:
- 單執行個體:容器關閉的視時候調用銷毀方法
- 多執行個體:容器不管理bean建立,就不會調用銷毀方法
初始化、銷毀方法定義的四種方式:
1、指定初始化與銷毀方法:
- xml的配置檔案中:配置init-method定義初始化方法,destroy-method定義銷毀方法。
-
@Bean注解的方式中:initMethod(初始化方法),destroyMtheod(銷毀方法)
測試示例:
public class Car {
public Car(){
System.out.println("car contructor ....");
}
public void init(){
System.out.println("car init ...");
}
public void destroy(){
System.out.println("car destroy ...");
}
}
@Configuration
public class MainConfigOfLifeCycle {
@Scope("singleton") //singleton prototype
@Bean(initMethod = "init", destroyMethod = "destroy")
public Car car(){
return new Car();
}
}
public class IOCTestLifeCycle {
@Test
public void test01(){
//建立容器
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfLifeCycle.class);
System.out.println("========容器建立完成=====");
Car bean = applicationContext.getBean(Car.class);
System.out.println(bean);
//關閉容器 調用銷毀方法
applicationContext.close();
}
}
測試結果:僅單執行個體測試結果
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiclRnblN2XjlGcjAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL0EkaNFTRE50dRpHW4Z0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLxkTM3ETOyYTMxADMxAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
2、java對象實作InitializingBean(定義初始化邏輯)與DisposableBean(定義銷毀邏輯)接口
定義Bean實作兩個接口:
@Component
public class Cat implements InitializingBean, DisposableBean {
public Cat(){
System.out.println("cat constructor ...");
}
/**
* bean銷毀邏輯定義
* @throws Exception
*/
public void destroy() throws Exception {
System.out.println("cat destroy ... ");
}
/**
* bean初始化邏輯定義:對象建立完成,屬性指派好以後調用
* @throws Exception
*/
public void afterPropertiesSet() throws Exception {
System.out.println("cat init ... ");
}
}
包掃描的方式将Cat添加到容器:
@ComponentScan("com.hk.bean")
@Configuration
public class MainConfigOfLifeCycle {
@Scope("singleton") //singleton prototype
@Bean(initMethod = "init", destroyMethod = "destroy")
public Car car(){
return new Car();
}
}
測試檢視容器中bean:
public class IOCTestLifeCycle {
@Test
public void test01(){
//建立容器
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfLifeCycle.class);
System.out.println("========容器建立完成=====");
//關閉容器 調用銷毀方法
applicationContext.close();
}
}
測試結果:單執行個體bean,在容器建立的時候建立對象,調用初始化方法。容器關閉的時候,調用銷毀方法。
3、使用JSR250規範中的注解:
@PostConstruct:在對象建立完成,并屬性指派以後調用。
@PreDestroy:在容器銷毀,移除bean之前調用
注解使用示例:
@Component
public class Dog {
public Dog(){
System.out.println("dog constructor ... ");
}
/**
* 對象建立并指派之後調用
*/
@PostConstruct
public void postConstruct(){
System.out.println("dog postConstruct ... ");
}
/**
* 容器銷毀之前調用
*/
@PreDestroy
public void preDestroy(){
System.out.println("dog preDestroy ... ");
}
}
測試代碼同2,此處略。
結果:
4、實作接口BeanPostProcessor的方法,會在Bean的初始化方法執行前後,執行自定義實作的接口方法的邏輯
- postProcessBeforeInitialization:在bean的任何初始化方法之前調用
- postProcessAfterInitialization:在bean的所有初始化之後執行
測試代碼同2;
測試結果:在初始化方法執行前後執行BeanPostProcessor接口的方法的實作
注意:未定義初始化前後的方法也會被執行。
回顧
前面的内容主要記錄了在IOC管理Bean的生命周期的時候,如何定義初始化和銷毀方法。
共有四種實作方式:
1、指定初始化與銷毀方法:@Bean注解的initMethod、destroyMethod
2、Bean實作接口:InitializingBean(出初始化) DisposableBean(銷毀方法)
3、使用JSR250規範定義的注解:@PostConstruct、@PreDestroy
4、實作接口BeanPostProcessor的方法,在Bean初始化方法執行前後,添加自定義邏輯
postProcessBeforeInitialization:在對象建立,并且屬性指派好以後,調用該方法,後面執行初始化方法。