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。它有這些方法:
看個範例:
設定檔中定義了一個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檔案對應的內容進行替換。
相關推薦:
ResourceLoaderAware 介面- [ Spring中文手冊]
以上是Spring容器擴充點:Bean後置處理器的詳細內容。更多資訊請關注PHP中文網其他相關文章!