1. 程式人生 > >Spring-9:Bean的生命週期

Spring-9:Bean的生命週期

本文介紹Spring框架中Bean的生命週期以及在特定時間點自定義任務的方法。這些方法包括:Bean的初始化方法、Bean的銷燬方法和Bean的後置處理器方法。

生命週期方法

Spring IOC 容器可以管理 Bean 的生命週期, Spring 允許在 Bean 生命週期的特定點執行定製的任務.

Spring IOC 容器對 Bean 的生命週期進行管理的過程:

1、通過構造器或工廠方法建立 Bean 例項

2、為 Bean 的屬性設定值

3、呼叫 Bean 的初始化方法

4、獲得可以使用的Bean 

5、當容器關閉時, 呼叫 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 的銷燬方法