Spring中配置和讀取多個Properties文件

一個系統中一般會存在以下一些以Properties形式存在的配置文件java

1.數據庫配置文件demo-db.properties:mysql

database.url=jdbc:mysql://localhost/smaple  

database.driver=com.mysql.jdbc.Driver  

database.user=root  

database.password=123  

2.消息服務配置文件demo-mq.properties:spring

#congfig of ActiveMQ  

mq.java.naming.factory.initial=org.apache.activemq.jndi.ActiveMQInitialContextFactory  

mq.java.naming.provider.url=failover:(tcp://localhost:61616?soTimeout=30000&connectionTimeout=30000)?jms.useAsyncSend=true&timeout=30000  

mq.java.naming.security.principal=  

mq.java.naming.security.credentials=  

jms.MailNotifyQueue.consumer=5  

3.遠程調用的配置文件demo-remote.properties:sql

remote.ip=localhost  

remote.port=16800  

remote.serviceName=test  

 

1、系統中須要加載多個Properties配置文件數據庫

應用場景:Properties配置文件不止一個,須要在系統啓動時同時加載多個Properties文件。apache

配置方式:tcp

<?xml version="1.0" encoding="UTF-8"?>  

<beans xmlns="http://www.springframework.org/schema/beans"  

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  

    xsi:schemaLocation="  

    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">  

      

    <!-- 將多個配置文件讀取到容器中,交給Spring管理 -->  

    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">  

        <property name="locations">  

           <list>  

              <!-- 這裏支持多種尋址方式:classpath和file -->  

              <value>classpath:/opt/demo/config/demo-db.properties</value>  

              <!-- 推薦使用file的方式引入,這樣能夠將配置和代碼分離 -->  

              <value>file:/opt/demo/config/demo-mq.properties</value>  

              <value>file:/opt/demo/config/demo-remote.properties</value>  

            </list>  

        </property>  

    </bean>  

      

    <!-- 使用MQ中的配置 -->  

    <bean id="MQJndiTemplate" class="org.springframework.jndi.JndiTemplate">  

        <property name="environment">  

            <props>  

                <prop key="java.naming.factory.initial">${mq.java.naming.factory.initial}</prop>  

                <prop key="java.naming.provider.url">${mq.java.naming.provider.url}</prop>  

                <prop key="java.naming.security.principal">${mq.java.naming.security.principal}</prop>  

                <prop key="java.naming.security.credentials">${mq.java.naming.security.credentials}</prop>  

                <prop key="userName">${mq.java.naming.security.principal}</prop>  

                <prop key="password">${mq.java.naming.security.credentials}</prop>  

            </props>  

        </property>  

    </bean>  

</beans>  

 咱們也能夠將配置中的List抽取出來:ide

<?xml version="1.0" encoding="UTF-8"?>  

<beans xmlns="http://www.springframework.org/schema/beans"  

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  

    xsi:schemaLocation="  

    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">  

      

    <!-- 將多個配置文件位置放到列表中 -->  

    <bean id="propertyResources" class="java.util.ArrayList">  

        <constructor-arg>  

            <list>  

              <!-- 這裏支持多種尋址方式:classpath和file -->  

              <value>classpath:/opt/demo/config/demo-db.properties</value>  

              <!-- 推薦使用file的方式引入,這樣能夠將配置和代碼分離 -->  

              <value>file:/opt/demo/config/demo-mq.properties</value>  

              <value>file:/opt/demo/config/demo-remote.properties</value>  

            </list>  

        </constructor-arg>  

    </bean>  

      

    <!-- 將配置文件讀取到容器中,交給Spring管理 -->  

    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">  

        <property name="locations" ref="propertyResources" />  

    </bean>  

      

    <!-- 使用MQ中的配置 -->  

    <bean id="MQJndiTemplate" class="org.springframework.jndi.JndiTemplate">  

        <property name="environment">  

            <props>  

                <prop key="java.naming.factory.initial">${mq.java.naming.factory.initial}</prop>  

                <prop key="java.naming.provider.url">${mq.java.naming.provider.url}</prop>  

                <prop key="java.naming.security.principal">${mq.java.naming.security.principal}</prop>  

                <prop key="java.naming.security.credentials">${mq.java.naming.security.credentials}</prop>  

                <prop key="userName">${mq.java.naming.security.principal}</prop>  

                <prop key="password">${mq.java.naming.security.credentials}</prop>  

            </props>  

        </property>  

    </bean>  

</beans>  

 

2、整合多工程下的多個分散的Propertiesurl

應用場景:工程組中有多個配置文件,可是這些配置文件在多個地方使用,因此須要分別加載。spa

配置以下:

<?xml version="1.0" encoding="UTF-8"?>  

<beans xmlns="http://www.springframework.org/schema/beans"  

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  

    xmlns:p="http://www.springframework.org/schema/p"  

    xsi:schemaLocation="  

    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">  

      

    <!-- 將DB屬性配置文件位置放到列表中 -->  

    <bean id="dbResources" class="java.util.ArrayList">  

        <constructor-arg>  

        <list>  

            <value>file:/opt/demo/config/demo-db.properties</value>  

        </list>  

        </constructor-arg>  

    </bean>  

  

    <!-- 將MQ屬性配置文件位置放到列表中 -->  

    <bean id="mqResources" class="java.util.ArrayList">  

        <constructor-arg>  

        <list>  

            <value>file:/opt/demo/config/demo-mq.properties</value>  

        </list>  

        </constructor-arg>  

    </bean>  

      

    <!-- 用Spring加載和管理DB屬性配置文件 -->  

    <bean id="dbPropertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">  

        <property name="order" value="1" />  

        <property name="ignoreUnresolvablePlaceholders" value="true" />   

        <property name="locations" ref="dbResources" />  

    </bean>  

      

    <!-- 用Spring加載和管理MQ屬性配置文件 -->  

    <bean id="mqPropertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">  

        <property name="order" value="2" />  

        <property name="ignoreUnresolvablePlaceholders" value="true" />   

        <property name="locations" ref="mqResources" />  

    </bean>  

      

    <!-- 使用DB中的配置屬性 -->  

    <bean id="rmsDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"   

        p:driverClassName="${demo.db.driver}" p:url="${demo.db.url}" p:username="${demo.db.username}"   

        p:password="${demo.db.password}" pp:maxActive="${demo.db.maxactive}"p:maxWait="${demo.db.maxwait}"   

        p:poolPreparedStatements="true" p:defaultAutoCommit="false">  

    </bean>  

      

    <!-- 使用MQ中的配置 -->  

    <bean id="MQJndiTemplate" class="org.springframework.jndi.JndiTemplate">  

        <property name="environment">  

            <props>  

                <prop key="java.naming.factory.initial">${mq.java.naming.factory.initial}</prop>  

                <prop key="java.naming.provider.url">${mq.java.naming.provider.url}</prop>  

                <prop key="java.naming.security.principal">${mq.java.naming.security.principal}</prop>  

                <prop key="java.naming.security.credentials">${mq.java.naming.security.credentials}</prop>  

                <prop key="userName">${mq.java.naming.security.principal}</prop>  

                <prop key="password">${mq.java.naming.security.credentials}</prop>  

            </props>  

        </property>  

    </bean>  

</beans>  

 注意:其中order屬性表明其加載順序,而ignoreUnresolvablePlaceholders爲是否忽略不可解析的 Placeholder,如配置了多個PropertyPlaceholderConfigurer,則需設置爲true。這裏必定須要按照這種方式設置這兩個參數。

 

3、Bean中直接注入Properties配置文件中的值

應用場景:Bean中須要直接注入Properties配置文件中的值 。例以下面的代碼中須要獲取上述demo-remote.properties中的值:

Java代碼   

public class Client() {  

    private String ip;  

    private String port;  

    private String service;  

}  

 配置以下:

<?xml version="1.0" encoding="UTF-8"?>  

<beans xmlns="<a href="http://www.springframework.org/schema/beans">http://www.springframework.org/schema/beans</a>"  

 xmlns:xsi="<a href="http://www.w3.org/2001/XMLSchema-instance">http://www.w3.org/2001/XMLSchema-instance</a>"  

 xmlns:util="<a href="http://www.springframework.org/schema/util">http://www.springframework.org/schema/util</a>"  

 xsi:schemaLocation="  

 <a href="http://www.springframework.org/schema/beans">http://www.springframework.org/schema/beans</a> <a href="http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">http://www.springframework.org/schema/beans/spring-beans-3.0.xsd</a>  

 <a href="http://www.springframework.org/schema/util">http://www.springframework.org/schema/util</a> <a href="http://www.springframework.org/schema/util/spring-util-3.0.xsd">http://www.springframework.org/schema/util/spring-util-3.0.xsd</a>">  

   

 <!-- 這種加載方式能夠在代碼中經過@Value註解進行注入,   

 能夠將配置總體賦給Properties類型的類變量,也能夠取出其中的一項賦值給String類型的類變量 -->  

 <!-- <util:properties/> 標籤只能加載一個文件,當多個屬性文件須要被加載的時候,可使用多個該標籤 -->  

 <util:properties id="remoteSettings" location="file:/opt/demo/config/demo-remote.properties" />   

   

 <!-- <util:properties/> 標籤的實現類是PropertiesFactoryBean,  

 直接使用該類的bean配置,設置其locations屬性能夠達到一個和上面同樣加載多個配置文件的目的 -->  

 <bean id="settings"   

   class="org.springframework.beans.factory.config.PropertiesFactoryBean">  

   <property name="locations">  

  <list>  

    <value>file:/opt/rms/config/rms-mq.properties</value>  

    <value>file:/opt/rms/config/rms-env.properties</value>  

  </list>  

   </property>  

 </bean>  

</beans>  

 Client類中使用Annotation以下:

Java代碼   

import org.springframework.beans.factory.annotation.Value;  

public class Client() {  

    @Value ("#{remoteSettings['remote.ip']}")  

    private String ip;  

    @Value ("#{remoteSettings['remote.port']}")  

    private String port;  

    @Value ("#{remoteSettings['remote.serviceName']}")  

    private String service;  

}  

 

4、Bean中存在Properties類型的類變量

應用場景:當Bean中存在Properties類型的類變量須要以注入的方式初始化

1. 配置方式:咱們能夠用(三)中的配置方式,只是代碼中註解修改以下

Java代碼   

import org.springframework.beans.factory.annotation.Value;  

import org.springframework.beans.factory.annotation.Autowired;  

public class Client() {  

    @Value ("#{remoteSettings}")  

    private Properties remoteSettings;  

}  

 

2. 配置方式:也可使用xml中聲明Bean而且注入

Xml代碼   

<?xml version="1.0" encoding="UTF-8"?>  

<beans xmlns="http://www.springframework.org/schema/beans"  

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  

    xsi:schemaLocation="  

    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">  

      

    <!-- 可使用以下的方式聲明Properties類型的FactoryBean來加載配置文件,這種方式就只能當作Properties屬性注入,而不能獲其中具體的值 -->  

    <bean id="remoteConfigs" class="org.springframework.beans.factory.config.PropertiesFactoryBean">  

        <property name="locations">  

            <list>  

                <value>file:/opt/demo/config/demo-remote.properties</value>  

            </list>  

        </property>  

    </bean>  

      

    <!-- 遠端調用客戶端類 -->  

    <bean id="client" class="com.demo.remote.Client">  

        <property name="properties" ref="remoteConfigs" />  

    </bean>  

</beans>

Java代碼 以下:

import org.springframework.beans.factory.annotation.Autowired;  

public class Client() {  

    //@Autowired也可使用  

    private Properties remoteSettings;  


    //getter setter  

}  

 

上述的各個場景在項目羣中特別有用,須要靈活的使用上述各類配置方式。

相關文章
相關標籤/搜索