1. 程式人生 > >spring4.2.9 java專案環境下ioc原始碼分析 (九)——refresh之postProcessBeanFactory方法

spring4.2.9 java專案環境下ioc原始碼分析 (九)——refresh之postProcessBeanFactory方法

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都得到了,還有什麼不能幹的呢。