30

在我们设置环境变量后,AWS System.getProperty("JDBC_CONNECTION_STRING")http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create_deploy_Java.managing.html中进行了讨论。一切都很好,除了我不能System.getProperty在我的 Spring XML 配置代码中调用,也不能调用资源包快捷方式,因为资源包本身必须以某种方式提取这些环境变量来为它们提供服务。你能帮我把这个示例配置转换为使用环境变量吗?:-)

<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 使用基于环境变量的位置吗?哪个适用于最近的春季版本?

4

3 回答 3

49

首先将一个<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>

确保占位符名称与您设置的变量匹配。

于 2013-09-11T15:07:06.543 回答
9

如果您使用org.springframework.beans.factory.config.PropertyPlaceholderConfigurer类来加载属性文件,您可以将属性设置systemPropertiesMode为 value 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会以这种方式加载系统属性:

首先检查系统属性,然后再尝试指定的属性。这允许系统属性覆盖任何其他属性源。

通过这种方式,您应该能够将系统属性作为普通属性读取。

于 2013-09-11T15:09:05.873 回答
5

对于使用 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}
于 2015-12-11T09:40:15.437 回答