1. 程式人生 > >Spring配置文件<context:property-placeholder>標簽使用漫談

Spring配置文件<context:property-placeholder>標簽使用漫談

system 異常 efault spring容器 其他 查找 ati 位置 tag

<context:property-placeholder>標簽提供了一種優雅的外在化參數配置的方式,不過該標簽在Spring配置文件中只能存在一份!!!

眾所周知,Spring容器是采用反射掃描的發現機制,通過標簽的命名空間實例化實例,當Spring探測到容器中有一個org.springframework.beans.factory.config.PropertyPlaceholderCVonfigurer的Bean就會停止對剩余PropertyPlaceholderConfigurer的掃描,即只能存在一個實例!

<context:property-placeholder   
        location=""  
        file-encoding=""  
        ignore-resource-not-found=""  
        ignore-unresolvable=""  
        properties-ref=""  
        local-override=""  
        system-properties-mode=""  
        order=""  
/> 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

location:表示屬性文件位置,多個之間通過如逗號/分號等分隔;
file-encoding:文件編碼;
ignore-resource-not-found:如果屬性文件找不到,是否忽略,默認false,即不忽略,找不到將拋出異常
ignore-unresolvable:是否忽略解析不到的屬性,如果不忽略,找不到將拋出異常
properties-ref:本地java.util.Properties配置
local-override:是否本地覆蓋模式,即如果true,那麽properties-ref的屬性將覆蓋location加載的屬性
system-properties-mode:

系統屬性模式,ENVIRONMENT(默認),NEVER,OVERRIDE
ENVIRONMENT:將使用Spring 3.1提供的PropertySourcesPlaceholderConfigurer,其他情況使用Spring 3.1之前的PropertyPlaceholderConfigurer
OVERRIDE: PropertyPlaceholderConfigurer使用,因為在spring 3.1之前版本是沒有Enviroment的,所以OVERRIDE是spring 3.1之前版本的Environment
NEVER:只查找properties-ref、location;
order:
當配置多個<context:property-placeholder/>時的查找順序

使用註意:
1.location中的加載文件的順序
如果location中有多個文件:
classpath:db.properties,classpath:default.properties,classpath:default3.properties,classpath:default2.properties
將依次加載,值得註意的是如果後一個文件中有和前面某一個文件中屬性名是相同的,最終取的值是後加載的值
舉例來說:
default.properties文件中有個屬性名userId,其對應的值為-1
default2.properties文件中也有一個屬性名userId,其對應的值為-2
default3.properties文件中特有一個屬性名userId,其對於那個的值為-3

default.properties文件先加載,此時userId的值為-1,當default3.properties文件加載時將更新原來的值,此時userId的值為-3,同理,最後加載default2.properties文件,所以userId最終值為-2
所以需要避免不同屬性文件中的屬性名稱重名

2.ignore-resource-not-found和ignore-unresolvable兩個屬性是類似的作用,推薦配對使用
如果location中的文件指向了一個不存在的文件,那麽也極有可能意味著有屬性無法解析(雖然存在其他屬性文件中存在重名,但是這個是應該避免的)
所以當ignore-resource-not-found設為true時,ignore-unresolvable也必須設為true,其實當ignore-unresolvable設為true時,ignore-resource-not-found的值true或false,並不影響異常的拋出
如果設置為ture,後屬性值無法解析成功,將賦值為${屬性名}
不推薦將ignore-resource-not-found和ignore-unresolvable的值設置為ture,默認為false,可以有效避免程序運行異常

3.properties-ref屬性
引入其他方式引入的屬性文件

<bean id="refProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
    <property name="locations">
        <list>
            <value>classpath:default2.properties</value>
        </list>
    </property>
</bean>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

該屬性需要local-override配合使用,只有當local-override屬性值為true時,properties-ref屬性文件中屬性值將覆蓋location屬性文件屬性值(同名屬性)

4.local-override屬性
當local-override屬性值為true時,properties-ref屬性文件中屬性值將覆蓋location屬性文件屬性值(同名屬性)

5.sytem-properties-mode屬性
不同的sytem-properties-mode屬性定義了不同的查找順序
Environment環境:包括JDK環境,系統環境變量,Sevlet環境,Spring環境等,是Spring在3.1之後抽象的一個表示環境配置

在local-override屬性值為false,sytem-properties-mode屬性值為ENVIRONMENT或OVRRIDE時,查找順序是location,然後是environment或者System.getProperty(),System.getenv()(Spring 3.1 之前)
即現加載location指向的屬性文件,再加之environment指向的環境,當environment環境中存在和location指向的屬性文件中同名的屬性,則該屬性的值將被修改,取決於environment環境中的值
如果sytem-properties-mode屬性值為NEVER,則只查詢location指向的屬性文件

當local-override屬性值為true時,最後將加載properties-ref指向的文件,如遇到同名的,該同名屬性值將取決於properties-ref指向的文件中的值

所以,最終程序中獲取的值將是一個綜合作用後的值,一般情況下建議sytem-properties-mode屬性值為NEVER避免ENVIRONMENT環境中的不可控

Spring配置文件<context:property-placeholder>標簽使用漫談