web-dev-qa-db-ja.com

Spring XML構成内に環境変数を注入する方法は?

AWSは、環境変数を設定した後、 http://docs.aws.Amazon.com/elasticbeanstalk/latest/dg/create_deploy_Java.managing.htmlSystem.getProperty("JDBC_CONNECTION_STRING")について話します。 Spring XML構成コード内でSystem.getPropertyを呼び出すことも、リソースバンドルのショートカットを呼び出すこともできません。リソースバンドル自体がこれらの環境変数を何らかの方法で抽出してサービスを提供する必要があるためです。環境変数を使用するためにこのサンプル設定を変換してください。 :-)

<bean id="dataSource" class="org.Apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://secrethost:007/whois?autoReconnect=true" />
    <property name="username" value="bond" />
    <property name="password" value="abuginsidemistycorner" />
    <property name="initialSize" value="100" />

    <property name="minEvictableIdleTimeMillis">
        <value>300000</value>
    </property>

    <property name="timeBetweenEvictionRunsMillis">
        <value>60000</value>
    </property>

    <property name="maxIdle" value="20" />
</bean>

ここで人々が何をしているのか理解できませんでした:

Spring FileSystemResourceの環境変数ベースの場所を使用できますか? 最近の春バージョンで動作しますか?

29
Aubergine

最初に<context:property-placeholder .. />要素を構成に追加します。

<context:property-placeholder />

次に、設定でプレースホルダーを使用します。

<bean id="dataSource" class="org.Apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="${JDBC_CONNECTION_STRING}" />
    <property name="username" value="bond" />
    <property name="password" value="abuginsidemistycorner" />
    <property name="initialSize" value="100" />
    <property name="minEvictableIdleTimeMillis" value="30000" />
    <property name="timeBetweenEvictionRunsMillis" value="60000" />
    <property name="maxIdle" value="20" />
</bean>

プレースホルダー名が設定した変数と一致することを確認してください。

46
M. Deinum

クラス org.springframework.beans.factory.config.PropertyPlaceholderConfigurer を使用してプロパティファイルをロードする場合、プロパティsystemPropertiesModeを値SYSTEM_PROPERTIES_MODE_OVERRIDEに設定できます。

Spring.xmlには、次のBeanがあります。

<bean id="propertyPlaceholder"
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/>
    <property name="locations">
        <list>
            <value>classpath://file.properties</value>                  
        </list>
    </property>
</bean>

Springは次の方法でシステムプロパティをロードします:

指定されたプロパティを試す前に、まずシステムプロパティを確認してください。これにより、システムプロパティが他のプロパティソースをオーバーライドできます。

この方法で、システムプロパティを通常のプロパティとして読み取ることができるはずです。

9
MPavesi

JavaConfigを使用するユーザーの場合:

@Configurationファイルには、次のものが必要です。

@Bean 
public static PropertyPlaceholderConfigurer properties() {

    PropertyPlaceholderConfigurer ppc = new PropertyPlaceholderConfigurer();
    ClassPathResource[] resources = new ClassPathResource[ ] {
        new ClassPathResource("db.properties")
    };
    ppc.setLocations( resources );
    ppc.setIgnoreUnresolvablePlaceholders( true );
    ppc.setSearchSystemEnvironment(true);
    return ppc;
}

@Value("${db.url}")
private String dbUrl; 
@Value("${db.driver}")
private String dbDriver;
@Value("${db.username}")
private String dbUsername;
@Value("${db.password}")
private String dbPassword;

@Bean
public DataSource db() {

    BasicDataSource dataSource = new BasicDataSource();
    dataSource.setUrl(dbUrl);
    dataSource.setDriverClassName(dbDriver);
    dataSource.setUsername(dbUsername);
    dataSource.setPassword(dbPassword);
    return dataSource;
}

重要なのは次の行です:ppc.setSearchSystemEnvironment(true);

その後、db.propertiesで、私が持っている:

db.url = ${PG_URL}
db.driver = ${PG_DRIVER}
db.username = ${PG_USERNAME}
db.password = ${PG_PASSWORD}
5