2010-10-19 29 views
84

Làm thế nào để đọc biến môi trường hệ thống trong ngữ cảnh ứng dụng?cách đọc biến môi trường hệ thống trong ứng dụng SpringContext

Tôi muốn một cái gì đó như:

<util:properties id="dbProperties" 
     location="classpath:config_DEV/db.properties" /> 

hoặc

<util:properties id="dbProperties" 
     location="classpath:config_QA/db.properties" /> 

tùy thuộc vào environement.

Tôi có thể có nội dung như thế này trong ngữ cảnh ứng dụng của mình không?

<util:properties id="dbProperties" 
     location="classpath:config_${systemProperties.env}/db.properties" /> 

nơi val thực tế được thiết lập dựa trên HỆ THỐNG MÔI TRƯỜNG BIẾN

Tôi đang sử dụng Spring 3,0

Trả lời

46

Kiểm tra this article. Nó cung cấp cho bạn một số cách để thực hiện điều này, thông qua số PropertyPlaceholderConfigurer hỗ trợ các thuộc tính bên ngoài (thông qua thuộc tính systemPropertiesMode)

23

Vâng, bạn có thể làm <property name="defaultLocale" value="#{ systemProperties['user.region']}"/> ví dụ.

Biến systemProperties được xác định trước, xem 6.4.1 XML based configuration.

85

Bạn đang đóng: o) Spring 3.0 thêm Spring Expression Language. Bạn có thể sử dụng

<util:properties id="dbProperties" 
    location="classpath:config_#{systemProperties['env']}/db.properties" /> 

Kết hợp với java ... -Denv=QA sẽ giải quyết được sự cố của bạn. cũng

Lưu ý một lời nhận xét của @yiling:

Để truy cập vào biến môi trường hệ thống, đó là cấp hệ điều hành biến như amoe nhận xét, chúng tôi chỉ đơn giản là có thể sử dụng "systemEnvironment" thay vì "systemProperties" trong EL đó. Giống như #{systemEnvironment['ENV_VARIABLE_NAME']}

+0

java là gì ... -Denv = QA có nghĩa là gì? –

+2

Bạn đặt giá trị thuộc tính hệ thống java. Bạn có thể đọc giá trị này trong mã như 'assert System.getProperty (" env ") ==" QA ";' – amra

+0

Tôi nghĩ câu trả lời này không chính xác, điều này không cho phép đọc biến môi trường hệ thống. 'export', vv), nó chỉ cho phép đọc các thuộc tính hệ thống Java. – amoe

8

Trong định nghĩa bean của bạn, hãy đảm bảo bao gồm "searchSystemEnvironment" và đặt thành "true". Và nếu bạn đang sử dụng nó để xây dựng một đường dẫn đến một tập tin, chỉ định nó như là một tập tin: /// url.

Vì vậy, ví dụ, nếu bạn có một tập tin cấu hình nằm ở

/testapp/config/my.app.config.properties 

sau đó thiết lập một biến môi trường như vậy:

MY_ENV_VAR_PATH=/testapp/config 

và ứng dụng của bạn có thể tải các tập tin bằng cách sử dụng định nghĩa bean như này:

ví dụ

<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> 
+2

bây giờ làm cách nào tôi có thể đọc các thuộc tính được tải trong java? – Bhuvan

5

Đối với trường hợp sử dụng, tôi chỉ cần truy cập các thuộc tính hệ thống, nhưng cung cấp giá trị mặc định trong trường hợp chúng không được xác định.

Đây là cách bạn làm điều đó:

<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> 
6

Sử dụng mùa xuân EL bạn có thể eis example ghi như sau

<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> 
+0

Gợi ý tốt về giá trị mặc định –

1

Đây là cách bạn làm điều đó:

<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> 

Nhưng hãy nhớ mùa xuân được nạp đầu tiên và sau đó nó sẽ tải BeanIn MethodingvokingFactoryBean này. Vì vậy, nếu bạn đang cố gắng sử dụng điều này cho trường hợp thử nghiệm của bạn sau đó hãy chắc chắn rằng bạn sử dụng phụ thuộc vào. Ví dụ: trong trường hợp này

Trong trường hợp bạn đang sử dụng nó cho các lớp học chính của bạn tốt hơn để thiết lập thuộc tính này sử dụng pom.xml của bạn như

<systemProperty> 
    <name>deployment.env</name> 
    <value>dev</value> 
</systemProperty> 
27

Ngày nay bạn có thể đặt

@Autowired 
private Environment environment; 

trong @Component, @Bean, v.v. của bạn, sau đó truy cập các thuộc tính thông qua lớp Environment:

environment.getProperty("myProp"); 

Đối với tài sản duy nhất trong một @Bean

@Value("${my.another.property:123}") // value after ':' is the default 
Integer property; 

Một cách khác là tiện dụng @ConfigurationProperties đậu:

@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; 
} 

Lưu ý: Chỉ cần nhớ để khởi động lại nhật thực sau khi thiết lập một môi trường mới biến

+0

Biến env cũng có thể truy cập thông qua giao diện 'Môi trường' không? –

+0

@NikhilSahu Vâng, đúng vậy. Bạn truy cập chúng với cùng khóa như khi bạn truy vấn 'java.lang.System', ví dụ để lấy kiểu hệ điều hành bạn muốn' env.getProperty ("os.name") 'giả định' env' là cá thể của bạn của 'org .springframework.core.env.Environment'. – Ninetou

-2

Để có được một giá trị của biến hệ thống, sử dụng Simpy dưới mã:

System.getenv("property-name"); 
1

Bạn có thể đề cập đến các thuộc tính biến của bạn trong một tập tin bất động sản và xác định Các tệp thuộc tính của môi trường cụ thể như local.properties, production.propertied, v.v.

Bây giờ dựa trên môi trường, một trong những tệp thuộc tính này có thể được đọc trong một trình lắng nghe được gọi lúc khởi động, như ServletContextListener.

Tệp thuộc tính sẽ chứa các giá trị môi trường cụ thể cho các khóa khác nhau.

mẫu "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 

mẫu "sản xuất.tính chất"

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] 

Đối với sử dụng các thuộc tính tập tin, bạn có thể tận dụng nguồn tài nguyên như đề cập dưới đây

 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 có thể được định nghĩa là các biến môi trường với các giá trị phù hợp với môi trường địa phương và sản xuất.

Với những thay đổi này, appplicationContext.xml sẽ có các thay đổi sau

<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}" /> 

Hy vọng điều này sẽ hữu ích.

4

Khai báo giữ chỗ tài sản như sau

<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> 

Sau đó, cho phép nói rằng bạn muốn đọc System.property("java.io.tmpdir") cho đậu Tomcat của bạn hoặc bất kỳ đậu sau đó thêm sau trong tài sản của bạn file:

tomcat.tmp.dir=${java.io.tmpdir} 
0

Nhờ @Yiling. Đó là một gợi ý.

<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> 

Sau này, bạn nên có một biến môi trường có tên 'FILE_PATH'. Đảm bảo bạn khởi động lại máy sau khi tạo biến môi trường đó.

Các vấn đề liên quan