1. 程式人生 > >Spring中的後置處理器BeanPostProcessor

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的過濾;