spring boot environmentaware介面實現環境變數讀取和屬性物件的繫結
其實獲取系統變數有一種非常簡單的方法,直接一行程式碼搞定,程式碼為:
1 |
System.getenv().get( "JAVA_HOME" )
|
咱們這裡介紹凡是被spring管理的類,實現介面 EnvironmentAware 重寫方法 setEnvironment 可以在工程啟動時,獲取到系統環境變數和application配置檔案中的變數。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
package com.kfit.environment; import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.bind.RelaxedPropertyResolver;
import org.springframework.context.EnvironmentAware;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
/**
* 主要是@Configuration,實現介面:EnvironmentAware就能獲取到系統環境資訊; *
*
*/
@Configuration
public class MyEnvironmentAware implements EnvironmentAware{
//注入application.properties的屬性到指定變數中.
@Value ( "${spring.datasource.url}" )
private String myUrl;
/**
*注意重寫的方法 setEnvironment 是在系統啟動的時候被執行。
*/
@Override
public void setEnvironment(Environment environment) {
//列印注入的屬性資訊.
System.out.println( "myUrl=" +myUrl);
//通過 environment 獲取到系統屬性.
System.out.println(environment.getProperty( "JAVA_HOME" ));
//通過 environment 同樣能獲取到application.properties配置的屬性.
System.out.println(environment.getProperty( "spring.datasource.url" ));
//獲取到字首是"spring.datasource." 的屬性列表值.
RelaxedPropertyResolver relaxedPropertyResolver = new RelaxedPropertyResolver(environment, "spring.datasource." );
System.out.println( "spring.datasource.url=" +relaxedPropertyResolver.getProperty( "url" ));
System.out.println( "spring.datasource.driverClassName=" +relaxedPropertyResolver.getProperty( "driverClassName" ));
}
}
|
其中application.properties檔案資訊是:
1 2 3 4 5 6 7 8 9 10 11 |
########################################################
###datasource
########################################################
spring.datasource.url = jdbc:mysql: //localhost:3306/test
spring.datasource.username = root
spring.datasource.password = root
spring.datasource.driverClassName = com.mysql.jdbc.Driver
spring.datasource.max-active= 20
spring.datasource.max-idle= 8
spring.datasource.min-idle= 8
spring.datasource.initial-size= 10
|
@Controller @Service 等被Spring管理的類都支援,注意重寫的方法 setEnvironment 是在系統啟動的時候被執行。
或者如下Controller:
1 2 3 4 5 6 7 8 9 |
@Controller
publicclassPageControllerimplementsEnvironmentAware{
@Override
publicvoid setEnvironment(Environment environment) {
String s = environment.getProperty( "JAVA_HOME" );
System.out.println(s);
}
}
|
我們還可以通過@ConfigurationProperties 讀取application屬性配置檔案中的屬性。
1 2 3 4 5 6 7 8 9 |
Configuration
@ConditionalOnClass (Mongo. class )
@EnableConfigurationProperties (MongoProperties. class )
publicclassMongoAutoConfiguration {
@Autowired
private MongoProperties properties;
}
|
· @ConditionOnClass表明該@Configuration僅僅在一定條件下才會被載入,這裡的條件是Mongo.class位於類路徑上
· @EnableConfigurationProperties將Spring Boot的配置檔案(application.properties)中的spring.data.mongodb.*屬性對映為MongoProperties並注入到MongoAutoConfiguration中。
· @ConditionalOnMissingBean說明Spring Boot僅僅在當前上下文中不存在Mongo物件時,才會例項化一個Bean。這個邏輯也體現了Spring Boot的另外一個特性——自定義的Bean優先於框架的預設配置,我們如果顯式的在業務程式碼中定義了一個Mongo物件,那麼Spring Boot就不再建立。
1 2 3 4 5 6 7 8 9 10 |
@ConfigurationProperties (prefix = "spring.data.mongodb" )
publicclass MongoProperties {
private String host;
privateint port = DBPort.PORT;
private String uri = "mongodb://localhost/test" ;
private String database;
// ... getters/ setters omitted
}
|
它就是以spring.data.mongodb作為字首的屬性,然後通過名字直接對映為物件的屬性,同時還包含了一些預設值。如果不配置,那麼mongo.uri就是mongodb://localhost/test。
以上這個配置需要加入依賴:
1 2 3 4 5 6 |
<!--spring-boot-configuration:spring boot 配置處理器; -->
< dependency >
< groupId >org.springframework.boot</ groupId >
< artifactId >spring-boot-configuration-processor</ artifactId >
< optional
|