首頁 >Java >java教程 >Spring容器擴充點:Bean後置處理器

Spring容器擴充點:Bean後置處理器

php是最好的语言
php是最好的语言原創
2018-08-10 15:07:112504瀏覽

BeanPostProcessor(Bean後置處理器)常用在對bean內部的值進行修改;實作Bean的動態代理程式等。 

BeanFactoryPostProcessor和BeanPostProcessor都是spring初始化bean時對外暴露的擴充點。但它們有什麼區別呢? 
由《理解Bean生命週期》的圖可知:BeanFactoryPostProcessor是生命週期中最早被召喚的,遠早於BeanPostProcessor。它在spring容器載入了bean的定義檔之後,在bean實例化之前執行的。也就是說,Spring允許BeanFactoryPostProcessor在容器建立bean之前讀取bean配置元數據,並可進行修改。例如增加bean的屬性和值,重新設定bean是否為自動組裝的侯選者,重設bean的依賴項等等。

在srping設定檔中可以同時設定多個BeanFactoryPostProcessor,並透過在xml中註冊時設定’order’屬性來控制各個BeanFactoryPostProcessor的執行順序。

BeanFactoryPostProcessor介面定義如下:

public interface BeanFactoryPostProcessor {
    void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
}

介面只有一個方法postProcessBeanFactory。方法的參數是ConfigurableListableBeanFactory類型,在實際開發中,我們常用它的getBeanDefinition()方法來取得某個bean的元資料定義:BeanDefinition。它有這些方法: 
Spring容器擴充點:Bean後置處理器

看個範例: 
設定檔中定義了一個bean:

<bean id="messi" class="twm.spring.LifecycleTest.footballPlayer">
    <property name="name" value="Messi"></property>
    <property name="team" value="Barcelona"></property>
</bean>

建立類別beanFactoryPostProcessorImpl,實作介面BeanFactoryPostProcessor:

public class beanFactoryPostProcessorImpl implements BeanFactoryPostProcessor{

    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        System.out.println("beanFactoryPostProcessorImpl");
        BeanDefinition bdefine=beanFactory.getBeanDefinition("messi");
        System.out.println(bdefine.getPropertyValues().toString());
        MutablePropertyValues pv =  bdefine.getPropertyValues();  
            if (pv.contains("team")) {
                PropertyValue ppv= pv.getPropertyValue("name");
                TypedStringValue obj=(TypedStringValue)ppv.getValue();
                if(obj.getValue().equals("Messi")){
                    pv.addPropertyValue("team", "阿根延");  
                }
        }  
            bdefine.setScope(BeanDefinition.SCOPE_PROTOTYPE);
    }
}

呼叫類別:

public static void main(String[] args) throws Exception {
    ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
    footballPlayer obj = ctx.getBean("messi",footballPlayer.class);
    System.out.println(obj.getTeam());
}

輸出:

PropertyValues: length=2; bean property 'name'; bean property 'team' 
阿根延

在《PropertyPlaceholderConfigurer應用》提到的PropertyPlaceholderConfigurer這個類別就是BeanFactoryPostProcessor介面的實作。它會在容器建立bean之前,將類別定義中的佔位符(諸如${jdbc.url})用properties檔案對應的內容進行替換。

相關推薦:

關於Spring Bean擴充介面的方法介紹

ResourceLoaderAware 介面- [ Spring中文手冊] 

以上是Spring容器擴充點:Bean後置處理器的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn