Spring-9:Bean的生命週期
本文介紹Spring框架中Bean的生命週期以及在特定時間點自定義任務的方法。這些方法包括:Bean的初始化方法、Bean的銷燬方法和Bean的後置處理器方法。
生命週期方法
Spring IOC 容器可以管理 Bean 的生命週期, Spring 允許在 Bean 生命週期的特定點執行定製的任務.
Spring IOC 容器對 Bean 的生命週期進行管理的過程:
1、通過構造器或工廠方法建立 Bean 例項
2、為 Bean 的屬性設定值
3、呼叫 Bean 的初始化方法
4、獲得可以使用的Bean5、當容器關閉時, 呼叫 Bean 的銷燬方法
在 Bean 的聲明裡設定 init-method 和 destroy-method 屬性, 可以為 Bean 指定初始化和銷燬方法。
例項:定義Car類如下:
package com.atguigu.spring.beans.cycle; public class Car { public Car() { System.out.println("Constructor......"); } private String brand; public void setBrand(String brand) { System.out.println("set brand......."); this.brand = brand; } public void inint() { System.out.println("init......."); } public void destroy() { System.out.println("destory......"); } public String toString() { return "brand: " + brand; } }
在xml檔案中進行如下配置,指定初始化方法和銷燬方法。
<bean id="car" class="com.atguigu.spring.beans.cycle.Car"
init-method="inint"
destroy-method="destroy">
<property name="brand" value="audi"></property>
</bean>
bean的初始化方法和銷燬方法分別指定為init和destory方法,這裡的方法名並非固定,可以自定定義,只需要在xml檔案中正確的指定即可。
接下來在main方法中例項化這個類並獲得一個bean,可以看到如下列印資訊:
可以看到一個bean的生命週期為:
呼叫構造方法、set屬性、初始化、使用、銷燬。
後置處理器
我們可以定義後置處理器來對bean的生命週期進行更細緻的管理。
Bean 後置處理器允許在呼叫初始化方法前後對 Bean 進行額外的處理.
Bean 後置處理器對 IOC 容器裡的 所有 Bean 例項逐一處理, 而非單一例項。 其典型應用是:檢查 Bean 屬性的正確性或根據特定的標準更改 Bean 的屬性。
如果需要使用後置處理器,需要實現BeanPostProcessor介面。在每個 Bean 例項的生命週期中,Spring 在初始化方法被呼叫前後, 都會將bean傳遞給上述介面的以下兩個方法:
接上述例子,定義一個MyBeanPostProcessor類並實現BeanPostProcessor介面:
package com.atguigu.spring.beans.cycle;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
public class MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessAfterInitialization(Object arg0, String arg1)
throws BeansException {
System.out.println("postProcessAfterInitialization");
Car car = new Car();
car.setBrand("BaoMa");
return car;
}
@Override
public Object postProcessBeforeInitialization(Object arg0, String arg1)
throws BeansException {
System.out.println("postProcessBeforeInitialization");
return arg0;
}
}
在上面的後置處理器的postProcessAfterInitialization方法中我們直接返回了一個新的Car物件,在xml檔案中新增如下配置,被<!-- -->包裹的是說明,可以不寫:
<!--
實現BeanPostProcessor 介面,並且提供
Object postProcessBeforeInitialization(Object bean,String beanName):init-method 之前被呼叫
Object postProcessAfterInitialization(Object bean,String beanName): init-method 之後被呼叫
的實現
bean:bean 例項本身
beanName:IOC 容器配置的bean 的名字。
這兩個引數名也可能被寫成arg0和arg1,意義不變。
返回值:實際返回給使用者的 Bean,注意:可以在以上兩個方法中修改返回值的bean,甚至“偷樑換柱”返回一個新的bean。
-->
<!-- 配置 bean的後置處理器:不需要配置id, IOC 容器自動識別是一個BeanPostProcessor -->
<bean class="com.atguigu.spring.beans.cycle.MyBeanPostProcessor"></bean>
執行main方法,列印資訊如下:
可以看到後置處理器有很大許可權,將我們配置的brand為“audi”的bean直接替換成“baoma”。
算上Bean的後置處理器,bean的生命週期細化為:
1、通過構造器或工廠方法建立 Bean 例項
2、為 Bean 的屬性設定值
3、將 Bean 例項傳遞給 Bean 後置處理器的 postProcessBeforeInitialization 方法
4、呼叫 Bean 的初始化方法
5、將 Bean 例項傳遞給 Bean 後置處理器的 postProcessAfterInitialization方法
6、Bean 可以使用了
7、當容器關閉時, 呼叫 Bean 的銷燬方法