天天看點

spring注解開發——Bean生命周期Bean的生命周期初始化、銷毀方法定義的四種方式:

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();
    }
}
           

測試結果:僅單執行個體測試結果

spring注解開發——Bean生命周期Bean的生命周期初始化、銷毀方法定義的四種方式:

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,在容器建立的時候建立對象,調用初始化方法。容器關閉的時候,調用銷毀方法。

spring注解開發——Bean生命周期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,此處略。

結果:

spring注解開發——Bean生命周期Bean的生命周期初始化、銷毀方法定義的四種方式:

4、實作接口BeanPostProcessor的方法,會在Bean的初始化方法執行前後,執行自定義實作的接口方法的邏輯

  • postProcessBeforeInitialization:在bean的任何初始化方法之前調用
  • postProcessAfterInitialization:在bean的所有初始化之後執行

測試代碼同2;

測試結果:在初始化方法執行前後執行BeanPostProcessor接口的方法的實作

spring注解開發——Bean生命周期Bean的生命周期初始化、銷毀方法定義的四種方式:

注意:未定義初始化前後的方法也會被執行。

回顧

前面的内容主要記錄了在IOC管理Bean的生命周期的時候,如何定義初始化和銷毀方法。

共有四種實作方式:

1、指定初始化與銷毀方法:@Bean注解的initMethod、destroyMethod

2、Bean實作接口:InitializingBean(出初始化) DisposableBean(銷毀方法)

3、使用JSR250規範定義的注解:@PostConstruct、@PreDestroy

4、實作接口BeanPostProcessor的方法,在Bean初始化方法執行前後,添加自定義邏輯

postProcessBeforeInitialization:在對象建立,并且屬性指派好以後,調用該方法,後面執行初始化方法。