Springロード設定と複数のProptiesファイルの説明


一つのシステムには通常、以下のようなPropties形式で存在するプロファイルが存在します。
1.データベースプロファイルdemo-db.properties:

database.url=jdbc:mysql://localhost/smaple 
database.driver=com.mysql.jdbc.Driver 
database.user=root 
database.password=123 
2.メッセージサービス設定ファイルdemo-mq.properties:

#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:

remote.ip=localhost 
remote.port=16800 
remote.serviceName=test 
一、システムに複数のProptiesプロファイルをロードする必要があります。
アプリケーションシーン:Proptiesプロファイルは一つ以上で、システム起動時に複数のProptiesファイルを同時にロードする必要があります。
設定:

<?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を抽出することもできます。

<?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> 
二、多工程における複数の分散のProptiesを整合する。
アプリケーションシーン:プロジェクトグループには複数のプロファイルがありますが、これらのプロファイルは複数の場所で使用されていますので、それぞれ読み込む必要があります。
設定は以下の通りです

<?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属性はそのローディング順序を表していますが、InoreUnirevable Placeholdersは解析不能なPlace holderを無視するかどうか、複数のPropertyPlace holderConfigrerを配置するなら、trueに設定する必要があります。ここではこのように二つのパラメータを設定する必要があります。
三、BeanでProptiesプロファイルに直接注入する値
アプリケーションシーン:BeanはProptiesプロファイルの値を直接注入する必要があります。例えば、以下のコードでは、上記のdemo-remote.propertiesの値を取得する必要がある。

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" rel="external nofollow" rel="external nofollow" >http://www.springframework.org/schema/beans</a>" 
 xmlns:xsi="<a href="http://www.w3.org/2001/XMLSchema-instance" rel="external nofollow" >http://www.w3.org/2001/XMLSchema-instance</a>" 
 xmlns:util="<a href="http://www.springframework.org/schema/util" rel="external nofollow" rel="external nofollow" >http://www.springframework.org/schema/util</a>" 
 xsi:schemaLocation=" 
 <a href="http://www.springframework.org/schema/beans" rel="external nofollow" rel="external nofollow" >http://www.springframework.org/schema/beans</a> <a href="http://www.springframework.org/schema/beans/spring-beans-3.0.xsd" rel="external nofollow" >http://www.springframework.org/schema/beans/spring-beans-3.0.xsd</a> 
 <a href="http://www.springframework.org/schema/util" rel="external nofollow" rel="external nofollow" >http://www.springframework.org/schema/util</a> <a href="http://www.springframework.org/schema/util/spring-util-3.0.xsd" rel="external nofollow" >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を使うと以下の通りです。

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; 
}
四、BeanにProptiesタイプのクラス変数があります。
アプリケーションシーン:BeanにProptiesタイプのクラス変数が存在する場合は、注入方式で初期化する必要があります。
1.構成方式:(三)の構成方式を使ってもいいです。ただし、コードの中には下記のように注釈があります。

import org.springframework.beans.factory.annotation.Value; 
import org.springframework.beans.factory.annotation.Autowired; 
public class Client() { 
  @Value("#{remoteSettings}") 
  private Properties remoteSettings; 
} 
2.構成方式:ビーンを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> 
コードは以下の通りです

import org.springframework.beans.factory.annotation.Autowired; 
public class Client() { 
  //@Autowired      
  private Properties remoteSettings; 
  //getter setter 
} 
上記の各シーンはプロジェクト群の中で特に有用であり、上述の様々な構成方式を柔軟に使用する必要がある。
多くの場合、プロファイルにいくつかの属性を配置してからbeanに注入する必要があります。Springはorg.springframework.beans.factory.config.PreferencesPlaceholderConfigurer種類を提供しています。注釈を使って直接propertiesファイルに注入する構成が便利です。
具体的な操作を見てみます。
まず、maven項目を新規作成し、pomファイルにspring依存を追加します。以下のpom.xmlファイル:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>
 <groupId>cn.outofmemory</groupId>
 <artifactId>hellospring.properties.annotation</artifactId>
 <version>0.0.1-SNAPSHOT</version>
 <packaging>jar</packaging>
 <name>hellospring.properties.annotation</name>
 <url>http://maven.apache.org</url>
 <properties>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  <org.springframework-version>3.0.0.RC2</org.springframework-version>
 </properties>
 <dependencies>
  <dependency>
   <groupId>junit</groupId>
   <artifactId>junit</artifactId>
   <version>3.8.1</version>
   <scope>test</scope>
  </dependency>       
  <!-- Spring -->
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>${org.springframework-version}</version>
  </dependency>
 </dependencies>
</project>
propertiesファイルに自動的に注入する構成には、springプロファイルにorg.springframework.beans.factory.config.PropertiesFactoryBeanorg.springframework.beans.factory.config.PreferencesPlaceholderConfigurerの構成例を追加する必要があります。
以下のspringプロファイルapContactext.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"
 xmlns:context="http://www.springframework.org/schema/context"
 xsi:schemaLocation="http://www.springframework.org/schema/beans
 http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
 http://www.springframework.org/schema/context
 http://www.springframework.org/schema/context/spring-context-3.0.xsd ">
  <!-- bean annotation driven -->
  <context:annotation-config />
  <context:component-scan base-package="cn.outofmemory.hellospring.properties.annotation">
  </context:component-scan>
  <bean id="configProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
    <property name="locations">
      <list>
        <value>classpath*:application.properties</value>
      </list>
    </property>
  </bean>
  <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer">
    <property name="properties" ref="configProperties" />
  </bean>  
</beans>
この構成ファイルには注釈スキャンとconfigPropertiesの例とpropertyConfigurerの例が構成されている。このように私達はjava類に自動的に注入して配置することができます。java類ではどうすればいいですか?

package cn.outofmemory.hellospring.properties.annotation;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class MySQLConnectionInfo {
  @Value("#{configProperties['mysql.url']}")
  private String url;
  @Value("#{configProperties['mysql.userName']}")
  private String userName;
  @Value("#{configProperties['mysql.password']}")
  private String password;
  /**
   * @return the url
   */
  public String getUrl() {
    return url;
  }
  /**
   * @return the userName
   */
  public String getUserName() {
    return userName;
  }
  /**
   * @return the password
   */
  public String getPassword() {
    return password;
  }
}
自動注入は@Value注解を使用する必要があります。この注釈のフォーマットは#{configProperties['mysql.url']}です。ここでconfigProptiesは私達がappContect.xmlに配置したbeanIdで、mysql.urlはpropertiesファイルの構成項目です。
propertiesファイルの内容は以下の通りです。

mysql.url=mysql's url
mysql.userName=mysqlUser
mysql.password=mysqlPassword
最後に上記の書き方に問題があるかどうかをテストします。App.javaファイルの内容は以下の通りです。

package cn.outofmemory.hellospring.properties.annotation;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
 * Hello world!
 *
 */
public class App 
{
  public static void main( String[] args )
  {
    ApplicationContext appContext = new ClassPathXmlApplicationContext("appContext.xml");
    MySQLConnectionInfo connInfo = appContext.getBean(MySQLConnectionInfo.class);
    System.out.println(connInfo.getUrl());
    System.out.println(connInfo.getUserName());
    System.out.println(connInfo.getPassword());
  }
}
メインメソッドでは、まずappContectを宣言し、自動的に注入されたMySQLConnection Infoの例を取得してからプリントアウトし、実行プログラムはプロファイルに設定された値を出力します。
締め括りをつける
以上はこの文章の全部の内容です。本文の内容は皆さんの学習や仕事に対して一定の参考学習価値を持ってほしいです。ありがとうございます。もっと知りたいなら、下のリンクを見てください。