IOC容器中 Bean 的生命周期的管理
- Spring IOC容器可以管理Bean的生命周期,Spring 允许在Bean生命周期的特定点执行定制的任务.
Spring IOC 容器对Bean的生命周期进行管理的过程:
通过构造器或工厂方法创建Bean
- 为Bean的属性设置值和对其他Bean的引用
- 调用Bean的初始化方法
- Bean可以使用了
- 当容器关闭时,调用Bean的销毁方法在Bean的声明里设置init-method和destroy-method属性,为Bean指定初始化和销毁方法
// src/com/lijunyang/model/Car.java
public class Car {
public Car() {
System.out.println("Car`s Constructor...");
}
private String brand;
public void setBrand(String brand) {
System.out.println("setBrand...");
this.brand = brand;
}
public void init2(){
System.out.println("init...");
}
public void destroy(){
System.out.println("destroy...");
}
}
public class Main{
public static void main(String[] args) {
ClassPathXmlApplicationContext ctx =
new ClassPathXmlApplicationContext("application.xml");
Car car = (Car) ctx.getBean("car");
System.out.println(car);
// 关闭IOC容器
ctx.close();
}
}
// src/application.xml
<beans>
<bean id="car" class="com.lijunyang.model.Car"
init-method="init2"
destroy-method="destroy"
>
<property name="brand" value="Audi" />
</bean>
</beans>
配置Bean的后置管理器
- Bean后置处理器允许在调用初始化方法前后对Bean进行额外的处理
- Bean后置处理器对IOC容器里的所有Bean实例逐一处理,而非单一实例,其典型的应用是:检查Bean属性的真确性或根据特定的标准更改Bean的属性
- 对Bean后置处理器而言,需要实现Interface BeanPostProcessor接口,在初始化方法被调用前后,Spring将把每个Bean实例分别传递给上诉接口的一下两个方法
Object postProcessBeforeInitialization(Object bean, String beanName)
Object postProcessAfterInitialization(Object bean, String beanName)
Spring IOC容器对Bean的生命周期进行管理的过程:
通过构造器或工厂方法创建Bean
- 为Bean的属性设置值和对其他Bean的引用
- 将Bean实例传递给Bean后置处理方法的postProcessBeforeInitialization方法
- 调用Bean的初始化方法
- 将Bean实例传递给Bean后置处理方法的postProcessAfterInitialization方法
- Bean可以使用了
- 当容器关闭时,调用Bean的销毁方法
// 在此src/application.xml文件中加入Bean
<bean class="com.lijunyang.model.MyBeanPostProcessor" />
// src/com/lijunyang/model/MyBeanPostProcessor.java // 创建Bean的后置处理程序
public class MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
System.out.println("postProcessBeforeInitialization: " + bean + "," + beanName);
if ("car".equals(beanName)) {
// car...
}
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName)
throws BeansException {
System.out.println("postProcessAfterInitialization: " + bean + "," + beanName);
// Car car = new Car(); 可以在这里改变bean的实例
// car.setBrand("Ford");
// return car;
return bean;
}
}