Spring 4.x——Bean的生命週期

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();

	}
}

運行結果:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章