Ответ 1
Проверьте эту статью. Это дает вам несколько способов сделать это через PropertyPlaceholderConfigurer
который поддерживает внешние свойства (через свойство systemPropertiesMode
).
Как прочитать переменную системной среды в контексте приложения?
Мне нужно что-то вроде:
<util:properties id="dbProperties"
location="classpath:config_DEV/db.properties" />
или
<util:properties id="dbProperties"
location="classpath:config_QA/db.properties" />
в зависимости от окружения.
Могу ли я иметь что-то подобное в моем приложении Контекст?
<util:properties id="dbProperties"
location="classpath:config_${systemProperties.env}/db.properties" />
где фактический val устанавливается на основе параметра SYSTEM ENVIRONMENT VARIABLE
Я использую Spring 3.0
Проверьте эту статью. Это дает вам несколько способов сделать это через PropertyPlaceholderConfigurer
который поддерживает внешние свойства (через свойство systemPropertiesMode
).
Вы близко: o) Spring 3.0 добавляет Spring Язык выражений. Вы можете использовать
<util:properties id="dbProperties"
location="classpath:config_#{systemProperties['env']}/db.properties" />
В сочетании с java ... -Denv=QA
следует решить вашу проблему.
Обратите внимание также на комментарий @yiling:
Чтобы получить доступ к переменной системной среды, это уровень ОС переменные, как прокомментировал амоэ, мы можем просто использовать "systemEnvironment", вместо "systemProperties" в этом EL. подобно
#{systemEnvironment['ENV_VARIABLE_NAME']}
В настоящее время вы можете установить
@Autowired
private Environment environment;
в ваших @Component
, @Bean
и т.д., а затем получить доступ к свойствам через класс Environment
:
environment.getProperty("myProp");
Для одного свойства в @Bean
@Value("${my.another.property:123}") // value after ':' is the default
Integer property;
Другой способ - удобный @ConfigurationProperties
beans:
@ConfigurationProperties(prefix="my.properties.prefix")
public class MyProperties {
// value from my.properties.prefix.myProperty will be bound to this variable
String myProperty;
// and this will even throw a startup exception if the property is not found
@javax.validation.constraints.NotNull
String myRequiredProperty;
//getters
}
@Component
public class MyOtherBean {
@Autowired
MyProperties myProperties;
}
Примечание. Не забудьте перезапустить eclipse после установки новой переменной среды
Да, вы можете сделать <property name="defaultLocale" value="#{ systemProperties['user.region']}"/>
например.
Переменная systemProperties предопределена, см. 6.4.1 Конфигурация на основе XML.
В определении bean обязательно включите "searchSystemEnvironment" и установите значение "true". И если вы используете его для создания пути к файлу, укажите его как файл:///url.
Так, например, если у вас есть файл конфигурации, расположенный в
/testapp/config/my.app.config.properties
затем установите переменную среды следующим образом:
MY_ENV_VAR_PATH=/testapp/config
и ваше приложение может загрузить файл с помощью определения bean следующим образом:
например.
<bean class="org.springframework.web.context.support.ServletContextPropertyPlaceholderConfigurer">
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
<property name="searchSystemEnvironment" value="true" />
<property name="searchContextAttributes" value="true" />
<property name="contextOverride" value="true" />
<property name="ignoreResourceNotFound" value="true" />
<property name="locations">
<list>
<value>file:///${MY_ENV_VAR_PATH}/my.app.config.properties</value>
</list>
</property>
</bean>
Используя Spring EL, вы можете пример eis написать следующим образом
<bean id="myBean" class="path.to.my.BeanClass">
<!-- can be overridden with -Dtest.target.host=http://whatever.com -->
<constructor-arg value="#{systemProperties['test.target.host'] ?: 'http://localhost:18888'}"/>
</bean>
В моем случае использования мне нужно было получить доступ к только системным свойствам, но предоставить значения по умолчанию, если они undefined.
Вот как вы это делаете:
<bean id="propertyPlaceholderConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
<property name="searchSystemEnvironment" value="true" />
</bean>
<bean id="myBean" class="path.to.my.BeanClass">
<!-- can be overridden with -Dtest.target.host=http://whatever.com -->
<constructor-arg value="${test.target.host:http://localhost:18888}"/>
</bean>
Объявите владельца места размещения следующим образом
<bean id="propertyPlaceholderConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
<property name="locations">
<list>
<value>file:///path.to.your.app.config.properties</value>
</list>
</property>
</bean>
Затем скажем, вы хотите прочитать System.property("java.io.tmpdir")
для своего Tomcat bean или любого bean, а затем добавить в свой файл свойств следующее:
tomcat.tmp.dir=${java.io.tmpdir}
Вот как вы это делаете:
<bean id="systemPrereqs" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean" scope="prototype">
<property name="targetObject" value="#{@systemProperties}" />
<property name="targetMethod" value="putAll" />
<property name="arguments">
<util:properties>
<prop key="deployment.env">dev</prop>
</util:properties>
</property>
</bean>
Но помните, что spring сначала загружается, а затем загружает этот bean MethodInvokingFactoryBean. Поэтому, если вы пытаетесь использовать это для своего тестового примера, убедитесь, что вы используете зависящее от него. Напр. в этом случае
Если вы используете его для своего основного класса, лучше установить это свойство, используя ваш pom.xml, как
<systemProperty>
<name>deployment.env</name>
<value>dev</value>
</systemProperty>
Вы можете указать свои переменные атрибуты в файле свойств и определить файлы свойств среды, такие как local.properties, production.propertied и т.д.
Теперь, основываясь на среде, один из этих файлов свойств можно прочитать в одном из прослушивателей, вызванных при запуске, например, ServletContextListener.
Файл свойства будет содержать специальные значения для различных ключей.
Пример "local.propeties"
db.logsDataSource.url=jdbc:mysql://localhost:3306/logs
db.logsDataSource.username=root
db.logsDataSource.password=root
db.dataSource.url=jdbc:mysql://localhost:3306/main
db.dataSource.username=root
db.dataSource.password=root
Пример "production.properties"
db.logsDataSource.url=jdbc:mariadb://111.111.111.111:3306/logs
db.logsDataSource.username=admin
db.logsDataSource.password=xyzqer
db.dataSource.url=jdbc:mysql://111.111.111.111:3306/carsinfo
db.dataSource.username=admin
[email protected]
Для использования этих файлов свойств вы можете использовать REsource, как указано ниже
PropertyPlaceholderConfigurer configurer = new PropertyPlaceholderConfigurer();
ResourceLoader resourceLoader = new DefaultResourceLoader();
Resource resource = resourceLoader.getResource("classpath:"+System.getenv("SERVER_TYPE")+"DB.properties");
configurer.setLocation(resource);
configurer.postProcessBeanFactory(beanFactory);
SERVER_TYPE может быть определена как переменная среды с соответствующими значениями для локальной и производственной среды.
С этими изменениями appplicationContext.xml будет иметь следующие изменения
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="${db.dataSource.url}" />
<property name="username" value="${db.dataSource.username}" />
<property name="password" value="${db.dataSource.password}" />
Надеюсь, что это поможет.
Благодаря @Yiling. Это был намек.
<bean id="propertyConfigurer"
class="org.springframework.web.context.support.ServletContextPropertyPlaceholderConfigurer">
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
<property name="searchSystemEnvironment" value="true" />
<property name="locations">
<list>
<value>file:#{systemEnvironment['FILE_PATH']}/first.properties</value>
<value>file:#{systemEnvironment['FILE_PATH']}/second.properties</value>
<value>file:#{systemEnvironment['FILE_PATH']}/third.properties</value>
</list>
</property>
</bean>
После этого у вас должна быть одна переменная среды с именем "FILE_PATH". Убедитесь, что вы перезапустите свой терминал /IDE после создания этой переменной среды.
Чтобы получить значение системной переменной, Simpy использует код ниже:
System.getenv("property-name");