一、概念
bean 的 后置处理器允许在调用 初始化方法前后 对 bean 进行额外的处理。
注意:bean 的后置处理器会对 IOC 容器里的所有的 bean 实例逐一进行处理,而非单一实例!
二、实现后置处理器
bean 的后置处理器需要实现接口:org.springframework.beans.factory.config.BeanPostProcessor
这个接口中有两个方法需要实现,在初始化方法被调用前后, Spring 将把每个 bean 实例分别传递给上面接口中的两个方法。
实现bean 的后置处理器:
/**
* 1、编写后置处理器的实现类
* 2、将后置处理器注册到【配置文件中】
*/
public class MyBeanPostProcessor implements BeanPostProcessor {
/**
* postProcessBeforeInitialization
* 初始化之前调用
*
* Object bean:将要初始化的bean
* String beanName:就是在 xml 中配置的 id
*
* @param bean
* @param beanName
* @return
* @throws BeansException
*/
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessBeforeInitialization" + "【"+ beanName +"】" + "bean将要调用初始化方法了。。。这个bean是这样的:" + "【"+ bean +"】" );
//返回传入的 bean
return bean;
}
/**
* postProcessAfterInitialization
* 初始化方法之后调用
*
* @param bean
* @param beanName
* @return
* @throws BeansException
*/
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessAfterInitialization" + "【"+ beanName +"】" + "bean初始化方法调用完毕了。。。");
//初始化之后返回的 bean,返回的是什么,容器中保存的就是什么
return bean;
}
}
配置:
<!--
Spring 有一个接口:后置处理器,可以在 bean 的初始化前后调用方法
-->
<bean id="myBeanPostProcessor" class="com.njf.spring.bean.MyBeanPostProcessor"></bean>
测试代码:
/**
* 后置处理器:
*
* (容器启动)构造器 —>后置处理器before方法 —> 初始化方法 —> 后置处理器的after方法
* 无论bean是否有初始化方法;后置处理器都会工作,默认其有,还会继续工作
*/
@Test
public void test9() {
ConfigurableApplicationContext ioc = new ClassPathXmlApplicationContext("ioc3.xml");
Object bean = ioc.getBean("book001");
System.out.println(bean);
ioc.close();
}
三、添加 bean 的后置处理器后的 bean 的生命周期
① 通过构造器或工厂方法创建 bean 实例;
② 为 bean的属性设置值和对其他 bean 的引用;
③ 将 bean 实例传递给 bean 后置处理器的 postProcessAfterInitialization() 方法;
④ 调用 bean 的初始化方法;
⑤ 将 bean 实例传递给 bean 后置处理器的 postProcessBeforeInitialization() 方法;
⑥ 使用操作 bean;
⑦ 当容器关闭时调用 bean 的销毁方法