一、概念
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(); }