一、什麼是Bean的生命週期
Bean的生命週期指的是Bean的創建-->初始化-->銷燬的一系列過程。
二、那我們可以在Bean初始化及銷燬的時候做一些事情,下面我將演示三種方法
1. 在@Bean中指定initMethod方法和destroyMethod方法,這種方法用的最多。
注:對於單實例bean,可以使用;但是對於多實例bean,容器只負責初始化,但不會管理bean,容器關閉時不會調用銷燬方法。
public class Dog {
public Dog(){
System.out.println("Dog construct。。。");
}
public void init(){
System.out.println("Dog init。。。");
}
public void destroy(){
System.out.println("Dog destroy。。。");
}
}
測試單實例:
@Configuration
public class MainConfig7 {
@Bean(initMethod = "init",destroyMethod = "destroy")
public Dog dog(){
return new Dog();
}
}
@Test
public void test01() {
AnnotationConfigApplicationContext app = new AnnotationConfigApplicationContext(MainConfig7.class);
System.out.println("容器加載完成。。。");
//關閉容器
app.close();
}
測試結果:
測試多實例:
@Configuration
public class MainConfig7 {
@Scope("prototype")
@Bean(initMethod = "init",destroyMethod = "destroy")
public Dog dog(){
return new Dog();
}
}
@Test
public void test01() {
AnnotationConfigApplicationContext app = new AnnotationConfigApplicationContext(MainConfig7.class);
System.out.println("容器加載完成。。。");
//多實例只有在使用的時候纔會去創建對象
app.getBean("dog");
//關閉容器
app.close();
}
測試結果:
2. 實現InitializingBean接口的afterPropertiesSet方法,相當於初始化方法;實現DisposableBean接口的destroy方法,相當於銷燬方法。
public class Cat implements InitializingBean,DisposableBean {
public Cat(){
System.out.println("Cat construct 。。。");
}
public void afterPropertiesSet() {
System.out.println("Cat afterPropertiesSet 。。。");
}
public void destroy() {
System.out.println("Cat destroy 。。。");
}
}
@Configuration
public class MainConfig7 {
/*@Scope("prototype")
@Bean(initMethod = "init",destroyMethod = "destroy")
public Dog dog(){
return new Dog();
}*/
@Bean
public Cat cat(){
return new Cat();
}
}
@Test
public void test01() {
AnnotationConfigApplicationContext app = new AnnotationConfigApplicationContext(MainConfig7.class);
System.out.println("容器加載完成。。。");
//多實例只有在使用的時候纔會去創建對象
// app.getBean("dog");
//關閉容器
app.close();
}
測試結果:
3. 可以使用JSP250規範定義的兩個註解實現:
(1)@PostConstruct:構造方法結束,bean創建完成之後,進行初始化
(2)@PreDestroy:在銷燬之前調用
public class Fish {
public Fish(){
System.out.println("Fish construct 。。。");
}
@PostConstruct
public void init() {
System.out.println("Fish init 。。。");
}
@PreDestroy
public void destroy() {
System.out.println("Fish destroy 。。。");
}
}
@Configuration
public class MainConfig7 {
/*@Scope("prototype")
@Bean(initMethod = "init",destroyMethod = "destroy")
public Dog dog(){
return new Dog();
}*/
/*@Bean
public Cat cat(){
return new Cat();
}*/
@Bean
public Fish fish(){
return new Fish();
}
}
@Test
public void test01() {
AnnotationConfigApplicationContext app = new AnnotationConfigApplicationContext(MainConfig7.class);
System.out.println("容器加載完成 。。。");
//多實例只有在使用的時候纔會去創建對象
// app.getBean("dog");
//關閉容器
app.close();
}
測試結果:
三、BeanPostProcessor:bean的後置處理器
上面主要介紹了初始化和銷燬兩個方法,spring還提供了一個BeanPostProcessor接口,可以在初始化之前和之後做一些事情,分別實現兩個方法:postProcessBeforeInitialization(),bean初始化之前攔截調用;postProcessAfterInitialization(),bean初始化之後調用。
public class MyPostProcessor implements BeanPostProcessor {
/**
* Created by dapeng on 2020/1/1.
* bean初始化之前調用
*/
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessBeforeInitialization 。。。beanName:"+beanName);
return bean;
}
/**
* Created by dapeng on 2020/1/1.
* bean初始化之後調用
*/
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessAfterInitialization 。。。beanName:"+beanName);
return bean;
}
}
@Configuration
public class MainConfig7 {
/*@Scope("prototype")
@Bean(initMethod = "init",destroyMethod = "destroy")
public Dog dog(){
return new Dog();
}*/
/*@Bean
public Cat cat(){
return new Cat();
}*/
@Bean
public Fish fish(){
return new Fish();
}
@Bean
public MyPostProcessor myPostProcessor(){
return new MyPostProcessor();
}
}
測試結果: