-
spring IOC容器可以管理Bean的生命周期,spring允许在Bean生命周期的特定点执行定制的任务
-
spring IOC容器对Bean的生命周期管理的过程
- 通过构造器或工厂方法创建Bean实例
- 为Bean的属性设置值和对其他Bean的引用
- 调用Bean的初始化方法
- Bean可以使用了
- 当容器关闭是,调用Bean的销毁方法
-
在Bean的声明里设置init-method和destroy-method属性,为bena初始化和销毁方法
测试如下,添加一个类Car
package cycle;
public class Car
{
private String brand;
public Car()
{
System.out.println("Car's Constructor...");
}
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..");
}
}
添加配置
<bean id="car" class="cycle.Car"
init-method="init"
destroy-method="destroy">
<property name="brand" value="Audi"></property>
</bean>
获取bean,运行获得结果
可以看到,先调用了类的构造方法,然后读取配置调用了类的set方法,然后调用了init方法,然后返回了这个Bean,最后在容器关闭的时候调用了destroy方法
实际上可以更细腻的定制Bean的生命周期方法,spring提供了一个Bean后置处理器
- Bean后置处理器允许在调用初始化方法前后对Bean进行额外的处理
- Bean后置处理器对IOC容器里的所有Bean实例逐一处理,而非单一实例,其典型应用是:检查Bean属性的正确性或根据特定的标准更改Bean的属性
- 对Bean后置处理器而言,需要实现Interface BeanPostProcessor接口,在初始化方法被调用前后,spring将把每个Bean实例分别传递给上述接口以下的两个方法
添加Bean后置处理器后IOC容器对Bean的声明周期进行管理的过程:
- 通过构造器或工厂方法创建Bean实例
- 为Bean的属性设置值和对其他Bean的引用
- 将Bean实例传递给Bean后置处理器的postProcessBeforeInitialization方法
- 调用Bean的初始化方法
- 将Bean实例传递Bean后置处理器的postProcessAfterInitialization方法
- Bean可以使用了
- 当容器关闭是,调用Bean的销毁方法
添加一个类MyBeanPostProcessor
package 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
{
// TODO Auto-generated method stub
System.out.println("postProcessAfterInitialization" + bean + "," +beanName);
return bean;
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException
{
// TODO Auto-generated method stub
System.out.println("postProcessBeforeInitialization" + bean + "," +beanName);
return bean;
}
}
添加对应的配置
<!-- 配置bean的后置处理器 -->
<!-- 不需要配置id,IOC容器会自动识别是一个BeanPostProcessor -->
<bean class="cycle.MyBeanPostProcessor">
</bean>
获取bean运行后得到结果
可以看到,Bean后置处理器还是很强大的,可以实现BeanPostProcessor接口,并具体提供Object postProcessBeforeInitialization(Object bean,String beanName)(init-method之前被调用)和Object postProcessAfterInitialization(Object bean,String beanName)(init-method之后被调用)方法。
bean:bean实例本身
beanName:IOC容器配置的bean的名字
返回值:是实际上返回给用户的那个Bean,注意:可以在以上两个方法中修改返回的Bean,甚至返回一个新的Bean