IOC 容器中Bean的生命周期

Posted by Johnnwen on April 4, 2016

IOC 容器中Bean的生命周期

Spring IOC 容器可以管理Bean的生命周期

Spring允许在Bean生命周期的特定执行点知性定制的任务

Spring容器对Bean的生命周期进行管理的过程:
  • 通过构造器或工厂方法创建Bean实例
  • 为Bean的属性设置值和对其他Bean的引用
  • 调用Bean的初始化方法
  • Bean可以使用
  • 当容器关闭时,调用Bean的销毁方法
在Bean的声明里设置init-method和destroy-method属性,为Bean指定初始化和销毁方法

主要代码如下

Spring配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

	<bean id = "car" class="com.wyw.spring.cycle.Car"
		init-method="init"
		destroy-method="destroy">
		<property name="brand" value="Audi"></property>
	</bean>

</beans>

Car类
public class Car {
	private String brand;

	public Car() {
		System.out.println("Car's Constructor");
	}

	public String getBrand() {
		return brand;
	}

	public void setBrand(String brand) {
		System.out.println("setbrand");
		this.brand = brand;
	}
	
	public void init(){
		System.out.println("init");
	}
	public void destroy(){
		System.out.println("destrory");
	}

}
测试类
public class Main {

	public static void main(String[] args) {
		
		ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans-cycle.xml");
		Car car = (Car)ctx.getBean("car");
		
		System.out.println(car);
		//关闭IOC容器
		ctx.close();

	}

}

控制台输出

Car's Constructor
setbrand
init
com.wyw.spring.cycle.Car@3e228ba7
destrory

创建Bean后置处理器

Bean后置处理器允许在调用初始化方法前后对Bean进行额外的处理
Bean后置处理器对IOC容器里的所有Bean实例逐一的处理(而不是单一实例)

其典型的应用是:检查Bean属性的正确性或根据特定的标准更改Bean属性

对Bean后置处理器而言,需要实现Interface BeanPostProcessor接口,在初始化方法别调用前,Spring将把每一个Bean实例分别传递给上述接口的一下两个方法:

postProcessAfterInitialization(Object bean, String beanName) :init-method之后被调用
postProcessBeforeInitialization(Object bean, String beanName) :init-method之前被调用
	
	bean:bean实例本身
	beanName:IOC容器配置的bean名字
	返回值是实际上返回给用户的Bean, 
	

 注意:可以在以上的两个方法中修改返回的Bean,甚至返回一个新的Bean  

添加Bean后置处理器的生命周期
  • 通过构造器或工厂方法创建Bean实例
  • 为Bean的属性设置值和对其他Bean的引用
  • 将Bean实例传递给Bean后置处理器的postProcessBeforeInitialization方法
  • 调用Bean的初始化方法
  • 将Bean实例传递给Bean后置处理器的postProcessBeforeInitialization方法
  • Bean可以使用
  • 当容器关闭时,调用Bean的销毁方法

主要代码如下

Spring配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

	<bean id = "car" class="com.wyw.spring.cycle.Car"
		init-method="init"
		destroy-method="destroy">
		<property name="brand" value="Audi"></property>
	</bean>
	
	<!-- 配置Bean的后置处理器 ,不需要配置id,IOC自动识别是一个BeanPostProcessor-->
	<!-- 实现BeanPostProcessor接口,并提供
	postProcessAfterInitialization(Object bean, String beanName) :init-method之后被调用
	postProcessBeforeInitialization(Object bean, String beanName) :init-method之前被调用
	的实现
	
	bean:bean实例本身
	beanName:IOC容器配置的bean名字
	返回值是实际上返回给用户的Bean,注意:可以在以上的两个方法中修改返回的Bean,甚至返回一个新的Bean
	 -->
	<bean class="com.wyw.spring.cycle.MyBeanPostProcessor">
	</bean>

</beans>

实现BeanPostProcessor接口的类
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("postProcessAfterInitialization:"+bean+","+beanName);
		if("car".equals(beanName)){
			
		}
		return bean;
	}

	@Override
	public Object postProcessBeforeInitialization(Object bean, String beanName)
			throws BeansException {
		System.out.println("postProcessBeforeInitialization:"+bean+","+beanName);
		Car car = new Car();
		car.setBrand("BenChi");
		return car;
	}	
}

控制台输出
Car's Constructor
setbrand
postProcessBeforeInitialization:Car [brand=Audi],car
Car's Constructor
setbrand
init
postProcessAfterInitialization:Car [brand=BenChi],car
Car [brand=BenChi]
destrory