IOC容器擴展-兩種後處理器

    Bean後處理器是一種特殊的 Bean,這種特殊的Bean不對外提供服務,它主要負責對容器中的其餘Bean執行後處理。Bean後處理器必須實現BeanPostProcessor接口,該接口有兩個方法:java

public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException

這兩個方法分別會在目標Bean初始化以前、初始化以後被回調,這兩個方法用於對容器中的Bean實列進行加強處理。spring

Bean後處理器代碼以下:app

package com.custle.spring.ioc;

import com.custle.spring.impl.Chinese;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;

/**
 * Created by admin on 2018/3/2.
 */
public class MyBeanPostProcessor implements BeanPostProcessor {
    /**
     * 對容器中的Bean實列進行後處理
     * @param bean 須要進行後處理的原Bean實列
     * @param beanName 須要進行後處理的Bean實列的名字
     * @return 返回處理完成後的Bean
     * @throws BeansException
     */
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("Bean 處理器在初始化以前對 " + beanName + " 進行加強處理。。。");
        //返回加強處理以後的Bean
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("Bean 後處理器在初始化以後對 "+ beanName + " 進行加強處理。。。");
        if(bean instanceof Chinese){
            //修改chinese的值
            Chinese chinese = (Chinese)bean;
            System.out.println(chinese.sayHello("java"));
            return chinese;
        }
        return bean;
    }
}
<bean id="chian" class="com.custle.spring.impl.Chinese" />
<bean id="myBeanPostProcessor" class="com.custle.spring.ioc.MyBeanPostProcessor"/>

定義Chinese:ide

package com.custle.spring.impl;

import com.custle.spring.inter.Person;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;

/**
 * Created by admin on 2018/3/1.
 */
public class Chinese implements Person,InitializingBean {
    @Override
    public String sayHello(String name) {
        return name + ",您好!";
    }

    @Override
    public String sayGoodBye(String name) {
        return name + ",再見!";
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("正在執行初始化方法 afterPropertiesSet()");
    }

}

測試程序:post

package com.custle.spring.test;

import com.custle.spring.inter.Person;
import com.custle.spring.ioc.MyBeanPostProcessor;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;

/**
 * Created by admin on 2018/3/2.
 */
public class BeanTest {
    public static void main(String[] args) {
        //CLASSPATH路徑下的xml建立Resource對象
        ClassPathResource resource = new ClassPathResource("applicationContext-spring.xml");
        //以Resource對象做爲參數,建立BeanFactory實列
        XmlBeanFactory factory = new XmlBeanFactory(resource);
        MyBeanPostProcessor myBeanPostProcessor = factory.getBean("myBeanPostProcessor", MyBeanPostProcessor.class);
        //註冊BeanPostProcessor實列
        factory.addBeanPostProcessor(myBeanPostProcessor);
        System.out.println("程序已經實列化BeanFactory...");
        Person p = factory.getBean("chian" , Person.class);
        System.out.println("程序中已經完成了 chinese bean 的實列化");
    }
}

控制檯輸出:測試

程序已經實列化BeanFactory...
Bean 處理器在初始化以前對 chian 進行加強處理。。。
正在執行初始化方法 afterPropertiesSet()
Bean 後處理器在初始化以後對 chian 進行加強處理。。。
java,您好!
程序中已經完成了 chinese bean 的實列化

須要注意的是:容器中一旦註冊了Bean後處理器,Bean後處理器就會自動啓動,在容器中每一個Bean建立時自動工做,加入Bean後處理器須要完成的工做。Bean後處理器兩個方法的回調時機以下:code

    實現BeanPostProstProcessor接口的Bean後處理器可對Bean進行任何操做,若是採用BeanFactory做爲Spring容器時,必須手動註冊BeanPostProcessor;若是採用ApplicationConext做爲Spring容器,則無需手動註冊Bean後處理器。ApplicationContext能夠自動檢測到容器中的Bean處理器,自動註冊。xml

相關文章
相關標籤/搜索