Spring的IoC是一個非常強大的東東其功能不僅僅是一個bean的容器本文從介紹Spring的分散配置來說明BeanFactoryPostProcessor接口
有的時候在看Spring的bean描述文件時你也許會遇到類似如下的一些配置
<bean id=message class=distConfigHelloMessage>
<property name=mes>
<value>${ssage}</value>
</property>
</bean>
其中竟然出現了變量引用${ssage}這就是Spring的分散配置可以在另外的配置文件中為ssage指定值
如在beanproperty配置如下定義
ssage=Hican you find me?
當訪問名為message的bean時mes屬性就會被置為字符串 Hican you find me?但Spring框架是怎麼知道存在這樣的配置文件呢?這就要靠PropertyPlaceholderConfigurer這個類的bean
<bean id=mesHandler class=orgspringframewonfigPropertyPlaceholderConfigurer>
<property name=locations>
<list>
<value>config/beanproperties</value>
</list>
</property>
</bean>
在這個bean中指定了配置文件為config/beanproperties到這裡似乎找到問題的答案了但是其實還有個問題這個mesHandler只不過是spring框架管理的一個bean並沒有被別的bean或者對象引用Spring的beanFactory是怎麼知道要從這個bean中獲取配置信息呢?
我們看看PropertyPlaceholderConfigurer這個類的繼承結構
從這個結構圖中可以看出PropertyPlaceholderConfigurer這個類間接繼承了BeanFactoryPostProcessor接口這是一個很特別的接口當Spring加載任何實現了這個接口的bean的配置時都會在bean工廠載入所有bean的配置之後執行postProcessBeanFactory方法在PropertyResourceConfigurer類中實現了postProcessBeanFactory方法在方法中先後調用了mergePropertiesconvertPropertiesprocessProperties這三個方法分別得到配置將得到的配置轉換為合適的類型最後將配置內容告知BeanFactory
正是通過實現BeanFactoryPostProcessor接口BeanFactory會在實例化任何bean之前獲得配置信息從而能夠正確解析bean描述文件中的變量引用
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28851.html