Springロード設定と複数のProptiesファイルの説明
20178 ワード
一つのシステムには通常、以下のようなPropties形式で存在するプロファイルが存在します。
1.データベースプロファイルdemo-db.properties:
アプリケーションシーン:Proptiesプロファイルは一つ以上で、システム起動時に複数のProptiesファイルを同時にロードする必要があります。
設定:
アプリケーションシーン:プロジェクトグループには複数のプロファイルがありますが、これらのプロファイルは複数の場所で使用されていますので、それぞれ読み込む必要があります。
設定は以下の通りです
三、BeanでProptiesプロファイルに直接注入する値
アプリケーションシーン:BeanはProptiesプロファイルの値を直接注入する必要があります。例えば、以下のコードでは、上記のdemo-remote.propertiesの値を取得する必要がある。
アプリケーションシーン:BeanにProptiesタイプのクラス変数が存在する場合は、注入方式で初期化する必要があります。
1.構成方式:(三)の構成方式を使ってもいいです。ただし、コードの中には下記のように注釈があります。
多くの場合、プロファイルにいくつかの属性を配置してからbeanに注入する必要があります。Springは
具体的な操作を見てみます。
まず、maven項目を新規作成し、pomファイルにspring依存を追加します。以下のpom.xmlファイル:
以下のspringプロファイルapContactext.xml
propertiesファイルの内容は以下の通りです。
締め括りをつける
以上はこの文章の全部の内容です。本文の内容は皆さんの学習や仕事に対して一定の参考学習価値を持ってほしいです。ありがとうございます。もっと知りたいなら、下のリンクを見てください。
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.PropertiesFactoryBean
とorg.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の例を取得してからプリントアウトし、実行プログラムはプロファイルに設定された値を出力します。締め括りをつける
以上はこの文章の全部の内容です。本文の内容は皆さんの学習や仕事に対して一定の参考学習価値を持ってほしいです。ありがとうございます。もっと知りたいなら、下のリンクを見てください。