(II)第九节:bean 的后置处理器

一、概念

  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 的销毁方法  
上一篇:SpringAOP[6]-按照name的自动代理


下一篇:Spring源码简易手写实现(学习过程记录)(二)