IOC 容器中 Bean 的生命周期方法
•Spring IOC 容器可以管理 Bean 的生命周期, Spring 允许在 Bean 生命周期的特定点执行定制的任务.
•Spring IOC 容器对 Bean 的生命周期进行管理的过程:
–通过构造器或工厂方法创建 Bean 实例
–为 Bean 的属性设置值和对其他 Bean 的引用
–调用 Bean 的初始化方法
–Bean 可以使用了
–当容器关闭时, 调用 Bean 的销毁方法
•在 Bean 的声明里设置 init-method 和 destroy-method 属性, 为 Bean 指定初始化和销毁方法.
创建 Bean 后置处理器
•Bean 后置处理器允许在调用初始化方法前后对 Bean 进行额外的处理.
•Bean 后置处理器对 IOC 容器里的所有 Bean 实例逐一处理, 而非单一实例. 其典型应用是: 检查 Bean 属性的正确性或根据特定的标准更改 Bean 的属性.
•对Bean 后置处理器而言, 需要实现 接口. 在初始化方法被调用前后, Spring 将把每个 Bean 实例分别传递给上述接口的以下两个方法:
添加 Bean 后置处理器后 Bean 的生命周期
•Spring IOC 容器对 Bean 的生命周期进行管理的过程:
–通过构造器或工厂方法创建 Bean 实例
–为 Bean 的属性设置值和对其他 Bean 的引用
–将 Bean 实例传递给 Bean 后置处理器的 postProcessBeforeInitialization 方法
–调用 Bean 的初始化方法
–将 Bean 实例传递给 Bean 后置处理器的 postProcessAfterInitialization方法
–Bean 可以使用了
–当容器关闭时, 调用 Bean 的销毁方法
car.java
package com.hzyc.spring.bean.cycle;
/**
* @author xuehj2016
* @Title: Car
* @ProjectName Spring
* @Description: TODO
* @date 2018/12/181:30
*/
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 init() {
System.out.println("init...");
}
public void destroy() {
System.out.println("destroy...");
}
@Override
public String toString() {
return "Car{" +
"brand='" + brand + '\'' +
'}';
}
}
MyBeanPostProcessor.java
package com.hzyc.spring.bean.cycle;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
/**
* @author xuehj2016
* @Title: MyBeanPostProcessor
* @ProjectName Spring
* @Description: TODO
* @date 2018/12/181:40
*/
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)){
//...
}
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessAfterInitialization : " + bean + "," + beanName);
Car car = new Car();
car.setBrand("长安");
return car;
}
}
bean-cycle.xml
<?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.hzyc.spring.bean.cycle.Car"
init-method="init"
destroy-method="destroy">
<property name="brand" value="宝马"/>
</bean>
<!--实现 BeanPostProcessor 接口,并具体提供两个方法
public Object postProcessBeforeInitialization(Object bean, String beanName)
public Object postProcessAfterInitialization(Object bean, String beanName)
的实现
bean : bean 实例本身
beanName : IOC 容器中配置 bean 的名字
返回值 : 是实际上返回给用户的那个 bean ,注意 : 可以在以上两个方法中修改返回的 bean ,甚至返回一个新的 bean
-->
<!--配置 bean 的后置处理器 : 不需要配置 id ,IOC 容器自动识别为 BeanPostProcessor-->
<bean class="com.hzyc.spring.bean.cycle.MyBeanPostProcessor"/>
</beans>
Main.java
package com.hzyc.spring.bean.cycle;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* @author xuehj2016
* @Title: Main
* @ProjectName Spring
* @Description: TODO
* @date 2018/12/181:35
*/
public class Main {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean-cycle.xml");
Car car=applicationContext.getBean(Car.class);
System.out.println(car);
//关闭 IOC 容器
((ClassPathXmlApplicationContext) applicationContext).close();
}
}