Spring IOC 容器可以管理 Bean 的生命週期,Spring 允許在 Bean 生命週期的特定點執行定製的任務。
1.Spring IOC 容器對 Bean 的生命週期進行管理的過程:
(1)通過構造器或工廠方法創建 Bean 實例;
(2)爲 Bean 的屬性設置值和對其他 Bean 的引用;
(3)將Bean實例傳遞給Bean後置處理器的postProcessBeforeInitiallization方法(可選);
(4)調用 Bean 的初始化方法;
(5)將Bean的實例轉化給Bean後置處理器的postProcessAfterInitialization方法(可選);
(6)使用Bean ;
(7)當容器關閉時, 調用 Bean 的銷燬方法。
說明:在 Bean 的聲明裏設置 init-method 和 destroy-method 屬性, 爲 Bean 指定初始化和銷燬方法。
2. 創建Bean後置處理器
Bean 後置處理器允許在調用初始化方法前後對 Bean 進行額外的處理。
Bean 後置處理器對 IOC 容器裏的所有 Bean 實例逐一處理, 而非單一實例。 其典型應用是: 檢查 Bean 屬性的正確性或根據特定的標準更改 Bean 的屬性。
對Bean 後置處理器而言, 需要實現 BeanPostProcessor接口,在初始化方法被調用前後, Spring 將把每個 Bean 實例分別傳遞給上述接口的以下兩個方法:
(1) Object postProcessAfterInitialization(Object bean, String beanName):init()之前被調用
(2)Object postProcessBeforeInitialization(Object bean, String beanName):init()之後被調用
例子程序:
<?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"
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.atguigu.spring.beans.collection.cycle.Car"
init-method="init2" destroy-method="destory">
<property name="brand" value="Audi"></property>
</bean>
<!-- 實現BeanPostProcessor接口,並具體提供
Object postProcessBeforeInitialization(Object bean,String beanName): init()之前被調用
Object postProcessAfterInitialization(Object bean,String beanName): init()之後被調用
bean:bean實例本身
beanName: IOC容器配置的bean的名字
return bean對象,可以在以上兩個方法中修改返回的bean,甚至返回一個新的bean
-->
<!-- 配置bean的後置處理器,不需要指定bean的id,IOC容器自動識別是一個BeanPostProcessor -->
<bean class="com.atguigu.spring.beans.collection.cycle.MyBeanPostProcessor"></bean>
</beans>
package com.atguigu.spring.beans.collection.cycle;
public class Car {
private String brand;
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
System.out.println("Set brand...");
this.brand = brand;
}
public Car(){
System.out.println("Car's Contructor...");
}
public void init2(){
System.out.println("init...");
}
public void destory(){
System.out.println("destory...");
}
}
package com.atguigu.spring.beans.collection.cycle;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
public class MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("before init:"+bean+beanName);
//可以在這裏執行bean的過濾
if("car".equals(beanName)){
//
}
return bean;
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("after destory:"+bean+beanName);
Car car=new Car();
car.setBrand("Ford");
return bean;
}
}
package com.atguigu.spring.beans.collection.cycle;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args) {
//1.創建Spring的IOC容器,在創建容器時,會完成bean對象的創建和初始化(setName方法)
ClassPathXmlApplicationContext ctx=new ClassPathXmlApplicationContext("beans-cycle.xml");//指定配置文件在類路徑下
Car car=(Car)ctx.getBean("car");
System.out.println(car);
//關閉IOC容器
ctx.close();
}
}
運行結果: