spring4.2.9 java專案環境下ioc原始碼分析 (九)——refresh之postProcessBeanFactory方法
阿新 • • 發佈:2018-12-31
postProcessBeanFactory後處理beanFactory。時機是在所有的beanDenifition載入完成之後,bean例項化之前執行。比如,在beanfactory載入完成所有的bean後,想修改其中某個bean的定義,或者對beanFactory做一些其他的配置,就可以用此方法。在系列文章中,可以實現ClassPathXmlApplicationContext類並重寫postProcessBeanFactory即可。
注:此功能和實現BeanFactoryPostProcess的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]om
在不改配置檔案的情況下我想修改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都得到了,還有什麼不能幹的呢。