Spring中的後置處理器BeanPostProcessor
一、Spring IOC容器中Bean的生命週期
Spring IOC容器可以管理Bean的生命週期,IOC容器允許在Bean生命週期的特定點執行定製的操作,即呼叫特定的方法。
1、Spring IOC容器對Bean的生命週期進行管理的過程:
(1)、通過構造器或工廠方法建立 Bean 例項;
(2)、為 Bean 的屬性設值和對其他 Bean 的引用;
(3)、呼叫 Bean 的初始化方法;
(4)、使用 Bean ;
(5)、當容器關閉時, 呼叫 Bean 的銷燬方法;
注意:在Bean的聲明裡設定init-method和destroy-method屬性, 為Bean指定初始化和銷燬方法。
2、示例程式碼如下:
//實體類 public class Car { private String brand; public Car() { System.out.println("constructor ...."); } public void setBrand(String brand) { this.brand = brand; System.out.println("set brand ...."); } public void init(){ System.out.println("init ....."); } public void destory(){ System.out.println("destory ...."); } @Override public String toString() { return "Car [brand=" + brand + "]"; } }
application.xml配置檔案
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd"> <bean id="car" class="com.xudong.spring.cycle.Car" init-method="init" destroy-method="destory"> <property name="brand" value="audi"></property> </bean> </beans>
測試程式:
public class Main {
public static void main(String[] args) {
ConfigurableApplicationContext apx = new ClassPathXmlApplicationContext("bean-cycle.xml");
Car car = (Car) apx.getBean("car");
System.out.println(car);
apx.close();
}
}
測試結果:
二、為Bean新增後置處理器(BeanPostProcessor)
1、後置處理器的特點:
(1)、Bean後置處理器允許在呼叫初始化方法前後對Bean進行額外的處理。
(2)、Bean後置處理器對IOC容器裡的所有Bean例項逐一處理, 而非單一例項。其典型應用是: 檢查 Bean 屬性的正確性或根據特定的標準更改 Bean 的屬性。
(3)、對Bean後置處理器而言, 需要實現org.springframework.beans.factory.config.Interface BeanPostProcessor介面。在初始化方法被呼叫前後,Spring將把每個Bean例項分別傳遞給上述介面的以下兩個方法:
//此方法在init-method方法之前被呼叫
postProcessBeforeInitialization(java.lang.Object bean,java.lang.String beanName)
//此方法在init-method方法之後被呼叫
postProcessAfterInitialization(java.lang.Object bean,java.lang.String beanName)
2、新增 Bean 後置處理器後 ,Spring IOC容器對 Bean 的生命週期進行管理的過程:
(1)、通過構造器或工廠方法建立 Bean 例項;
(2)、為 Bean 的屬性設定值和對其他 Bean 的引用;
(3)、將 Bean 例項傳遞給 Bean 後置處理器的 postProcessBeforeInitialization 方法;
(4)、呼叫 Bean 的初始化方法;
(5)、將 Bean 例項傳遞給 Bean 後置處理器的 postProcessAfterInitialization方法;
(6)、使用 Bean ;
(7)、當容器關閉時, 呼叫 Bean 的銷燬方法;
3、示例程式碼如下:
實體類同上:
application.xml檔案增加如下程式碼:
<bean class="com.scorpios.spring.cycle.MyBeanProcessor"></bean>
自定義的MyBeanProcessor程式碼:
public class MyBeanProcessor implements BeanPostProcessor {
/**
* 此方法在init-method方法之前被呼叫
*/
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessAfterInitialization :" + bean +","+beanName);
return bean;
}
/**
* 此方法在init-method方法之後被呼叫
*/
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessAfterInitialization :" + bean +","+ beanName);
return bean;
}
}
測試程式同上: 測試結果:
三、總結:
(1)、在配置檔案中,後置處理器的配置不需要id屬性指定,IOC容器會自己把它讀取並認定為Bean的後置處理器,並在Bean的初始化方法前後,執行兩個指定方法; (2)、後置處理器是對IOC容器中所有Bean都起作用,在用的時候,有必要的話,要進行Bean的過濾;