Spring框架下PropertyPlaceholderConfigurer類

要了解這個類首先要弄清楚一個概念:bean factory post-processor
官方解釋是這樣的:
A bean factory post-processor is a java class which implements the
org.springframework.beans.factory.config.BeanFactoryPostProcessor interface. It is executed manually (in the case of the BeanFactory) or automatically (in the case of the ApplicationContext) to apply changes of some sort to an entire BeanFactory, after it has been constructed.
我理解的意思是這樣的:
1.首先bean factory post-processor實現了org.springframework.beans.factory.config.BeanFactoryPostProcessor接口。
2.在BeanFactory的情況下它被手動的執行。
3.在ApplicationContext的條件下它會自動的執行。
4.最關鍵的一點是,是在一個類的實例被構造出來之後,對整個BeanFactory進行修改。

--------------------------------------------------------------------------------------------------------------------------------


Spring的框架中爲您提供了一個 BeanFactoryPostProcessor 的實作類別: org.springframework.beans.factory.config.PropertyPlaceholderConfigurer。藉由這個類別,您可以將一些組態設定,移出至.properties檔案中,如此的安排可以讓XML定義檔負責系統相關設定,而.properties檔可以作爲客戶根據需求,自定義一些相關的參數。
來看一個Bean定義檔的實際例子:

•beans-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
      "http://www.springframework.org/dtd/spring-beans.dtd">

<beans> 
        <bean id="configBean"
 class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
            <property name="location">
                <value>hello.properties</value>
            </property>
        </bean>

        <bean id="helloBean" class="onlyfun.caterpillar.HelloBean">
            <property name="helloWord">
                <value>${onlyfun.caterpillar.helloWord}</value>
            </property>
        </bean>
</beans>
假設在helloBean中有許多依賴注入的屬性,這些都是比較不常變動的屬性,而其中helloWord會經常變動,可以透過hello.properties來簡單的設定,而這個資訊已設定在configBean的location屬性中:

•hello.properties
onlyfun.caterpillar.helloWord=Welcome!
在helloBean的helloWord屬性中,${onlyfun.caterpillar.helloWord}將會被hello.properties的helloWord所取代。

如果有多個.properties檔案,則可以透過locations屬性來設定,例如:

•beans-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
      "http://www.springframework.org/dtd/spring-beans.dtd">

<beans> 
        <bean id="configBean"
      class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
            <property name="locations">
                <list>
                    <value>hello.properties</value>
                    <value>welcome.properties</value>
                    <value>other.properties</value>
   
                </list>
            </property>    
        </bean>

        <bean id="helloBean" class="onlyfun.caterpillar.HelloBean">
            <property name="helloWord">
                <value>${onlyfun.caterpillar.helloWord}</value>
            </property>
            ...
        </bean>
</beans> ======================================PropertyPlaceholderConfigurer類就是bean factory post-processor的一種,它的作用是一個資源屬性的配置器,能夠將BeanFactory的裏定義的內容放在一個以.propertis後綴的文件中。
例如---spring-context.xml----
 <bean id="propertyConfigurer"     class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
           <property name="locations">
               <list>
                   <value>/WEB-INF/jdbc.properties</value>
               </list>
           </property>
 </bean>

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
      <property name="driverClassName"><value>${driver}</value></property>
      <property name="url"><value>jdbc:${dbname}</value></property>
</bean>而實際的jdbc.propertis文件是
jdbc.driverClassName=org.hsqldb.jdbcDriver
jdbc.url=jdbc:hsqldb:hsql://production:9002
jdbc.username=sa
jdbc.password=root
而jdbc.propertis是怎樣引用的呢: 將上邊一段配置註冊在web.xml中就可以了
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-context.xml</param-value>
</context-param>
當然,不要忘了spring的監聽器註冊
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
這樣,一個簡單的數據源就設置完畢了。
實際上,PropertyPlaceholderConfigurer起的作用就是將佔位符指向的數據庫配置信息放在bean中定義
的工具。

發佈了58 篇原創文章 · 獲贊 1 · 訪問量 3563
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章