Подтвердить что ты не робот

Как вводить переменные окружения внутри конфигурации spring xml?

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?, которое будет работать для последней версии Spring?

4b9b3361

Ответ 1

Сначала добавьте элемент <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>

Убедитесь, что имена заполнителей соответствуют вашим переменным, которые вы установили.

Ответ 2

Если вы используете класс 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 загрузит свойства системы следующим образом:

Сначала проверьте свойства системы, прежде чем пытаться указать указанные свойства. Это позволяет системным свойствам переопределять любой другой источник свойств.

Таким образом, вы должны иметь возможность читать свойства системы как обычные свойства.

Ответ 3

Для тех, кто использует 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;
}

important - строка: ppc.setSearchSystemEnvironment(true);

после этого в db.properties я:

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