IOC 容器中 Bean 的生命周期方法
spring IOC 容器可以管理 Bean 的生命周期, Spring 允许在 Bean 生命周期的特定点执行定制的任务.
Spring IOC 容器对 Bean 的生命周期进行管理的过程:
- 通过构造器或工厂方法创建 Bean 实例- 为 Bean 的属性设置值和对其他 Bean 的引用
- 调用 Bean 的初始化方法
- Bean 可以使用了
- 当容器关闭时, 调用 Bean 的销毁方法
在 Bean 的声明里设置 init-method 和 destroy-method 属性, 为 Bean 指定初始化和销毁方法.
<bean id="car" class="com.atguigu.spring.cycle.Car" init-method="init" destroy-method="destory">
<property name="brand" value="Audi"></property>
</bean>
这里 Bean 初始化和销毁分别会调用 init 和 destroy 方法
public class Car {
private String brand;
public void setBrand(String brand) {
this.brand = brand;
}
public Car() {
System.out.println("Car's constructor...");
}
private void init() {
System.out.println("Car's init method...");
}
private void destory() {
System.out.println("Car's destory method...");
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return "Car [brand=" + brand + "]";
}
}
测试:
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();
}
运行结果:
信息: Loading XML bean definitions from class path resource [beans-cycle.xml]
Car's constructor...
Car's init method...
Car [brand=Audi]
十二月 16, 2016 2:36:58 下午 org.springframework.context.support.AbstractApplicationContext doClose
信息: Closing org.springframework.context.support.ClassPathXmlApplicationContext@51055f4d: startup date [Fri Dec 16 14:36:58 CST 2016]; root of context hierarchy
Car's destory method...
创建 Bean 后置处理器
Bean 后置处理器允许在调用初始化方法前后对 Bean 进行额外的处理.
Bean 后置处理器对 IOC 容器里的所有 Bean 实例逐一处理, 而非单一实例. 其典型应用是: 检查 Bean 属性的正确性或根据特定的标准更改 Bean 的属性.
对Bean 后置处理器而言, 需要实现 BeanPostProcessor 接口. 在初始化方法被调用前后, Spring 将把每个 Bean 实例分别传递给上述接口的以下两个方法:
配置后置处理器:
<!--
实现 BeanPostProcessor 接口,并具体提供
public Object postProcessBeforeInitialization(Object arg0, String arg1) : init-method 之前被调用
public Object postProcessAfterInitialization(Object arg0, String arg1) : init-method 之后被调用
agr0:bean 实例本身
arg1:IOC 容器配置的 bean 的名字
返回值:是实际上返回给用户的那个 bean,注意:可以在以上两个方法中修改返回的 bean,甚至返回一个新的 bean.
的实现
-->
<!-- 配置 bean 的后置处理器,不需要配置 id,IOC 容器自动识别是一个 BeanPostProcessor -->
<bean class="com.atguigu.spring.cycle.MyBeanPostProcessor"></bean>
实现 BeanPostProcessor 接口:
public class MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessAfterInitialization(Object arg0, String arg1)
throws BeansException {
System.out.println("postProcessAfterInitialization:" + arg0 + ", " + arg1);
return arg0;
}
@Override
public Object postProcessBeforeInitialization(Object arg0, String arg1)
throws BeansException {
System.out.println("postProcessBeforeInitialization:" + arg0 + ", " + arg1);
return arg0;
}
}
添加 Bean 后置处理器后 Bean 的生命周期
Spring IOC 容器对 Bean 的生命周期进行管理的过程:
- 通过构造器或工厂方法创建 Bean 实例
- 为 Bean 的属性设置值和对其他 Bean 的引用
- 将 Bean 实例传递给 Bean 后置处理器的 postProcessBeforeInitialization 方法
- 调用 Bean 的初始化方法
- 将 Bean 实例传递给 Bean 后置处理器的 postProcessAfterInitialization方法
- Bean 可以使用了
- 当容器关闭时, 调用 Bean 的销毁方法