Spring中Bean的生命週期

一、什麼是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();
    }
}

測試結果:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章