AbstractApplicationContext的refresh方法之postProcessBeanFactory方法

postProcessBeanFactory後處理beanFactory。時機是在所有的beanDenifition加載完成之後,bean實例化之前執行。比如,在beanfactory加載完成所有的bean後,想修改其中某個bean的定義,或者對beanFactory做一些其他的配置,就可以用此方法。在系列文章中,可以實現ClassPathXmlApplicationContext類並重寫postProcessBeanFactory即可。

注:此功能和實現BeanFactoryPostProcessor的postProcessBeanFactory方法類似,可以做同樣的功能。

默認情況下此方法是空的。需要子類去實現。下面是一個例子:

這裏偷個懶拿自定義標籤做一個例子

xml配置
 

<myTag:user id="test" userName="name" email="[email protected]"/>

測試:


 
  1. ClassPathXmlApplicationContext context=

  2. new ClassPathXmlApplicationContext("classpath:APP/CONTEXT/applicationContext-text.xml") ;

  3. User user=(User)context.getBean("test");

  4. System.out.println("username:"+user.getUserName()+":"+"email:"+user.getEmail());

運行結果爲:

username:name:email:[email protected]

在不改配置文件的情況下我想修改username的值,怎麼做呢?

就像上面說的寫個java類去繼承ClassPathXmlApplicationContext重寫postProcessBeanFactory方法。


 
  1. class MyApplicationContext extends ClassPathXmlApplicationContext{

  2. public MyApplicationContext(String s){

  3. super(s);

  4. }

  5.  
  6. @Override

  7. protected void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {

  8. BeanDefinition beanDefinition = beanFactory.getBeanDefinition("test");

  9. PropertyValue propertyValue=new PropertyValue("userName", "小陳");

  10. beanDefinition.getPropertyValues().addPropertyValue(propertyValue);

  11. }

  12. }

至於postProcessBeanFactory內的代碼不陌生吧,在解析標籤的時候就是通過PropertyValue把屬性寫到beanDefinition中的。

邏輯很簡單,得到beanName爲test的beanDefinition, 爲其新增一個屬性,但是這個屬性的名字已經存在過了,所以會覆蓋。

測試代碼:


 
  1. MyApplicationContext context=new MyApplicationContext("classpath:APP/CONTEXT/applicationContext-text.xml");

  2. User user=(User)context.getBean("test");

  3. System.out.println("username:"+user.getUserName()+":"+"email:"+user.getEmail());

測試結果:

username:小陳:email:[email protected]

這就做到了修改屬性的作用。其實這裏可以做的不止這些,beanFactory都得到了,還有什麼不能幹的呢。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章