postProcessBeanFactory後處理beanFactory。時機是在所有的beanDenifition加載完成之後,bean實例化之前執行。比如,在beanfactory加載完成所有的bean後,想修改其中某個bean的定義,或者對beanFactory做一些其他的配置,就可以用此方法。在系列文章中,可以實現ClassPathXmlApplicationContext類並重寫postProcessBeanFactory即可。
注:此功能和實現BeanFactoryPostProcessor的postProcessBeanFactory方法類似,可以做同樣的功能。
默認情況下此方法是空的。需要子類去實現。下面是一個例子:
這裏偷個懶拿自定義標籤做一個例子
xml配置
<myTag:user id="test" userName="name" email="[email protected]"/>
測試:
-
ClassPathXmlApplicationContext context=
-
new ClassPathXmlApplicationContext("classpath:APP/CONTEXT/applicationContext-text.xml") ;
-
User user=(User)context.getBean("test");
-
System.out.println("username:"+user.getUserName()+":"+"email:"+user.getEmail());
運行結果爲:
username:name:email:[email protected]
在不改配置文件的情況下我想修改username的值,怎麼做呢?
就像上面說的寫個java類去繼承ClassPathXmlApplicationContext重寫postProcessBeanFactory方法。
-
class MyApplicationContext extends ClassPathXmlApplicationContext{
-
public MyApplicationContext(String s){
-
super(s);
-
}
-
@Override
-
protected void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
-
BeanDefinition beanDefinition = beanFactory.getBeanDefinition("test");
-
PropertyValue propertyValue=new PropertyValue("userName", "小陳");
-
beanDefinition.getPropertyValues().addPropertyValue(propertyValue);
-
}
-
}
至於postProcessBeanFactory內的代碼不陌生吧,在解析標籤的時候就是通過PropertyValue把屬性寫到beanDefinition中的。
邏輯很簡單,得到beanName爲test的beanDefinition, 爲其新增一個屬性,但是這個屬性的名字已經存在過了,所以會覆蓋。
測試代碼:
-
MyApplicationContext context=new MyApplicationContext("classpath:APP/CONTEXT/applicationContext-text.xml");
-
User user=(User)context.getBean("test");
-
System.out.println("username:"+user.getUserName()+":"+"email:"+user.getEmail());
測試結果:
username:小陳:email:[email protected]
這就做到了修改屬性的作用。其實這裏可以做的不止這些,beanFactory都得到了,還有什麼不能幹的呢。