1. 程式人生 > >十五、Spring Boot 環境變量讀取 和 屬性對象的綁定

十五、Spring Boot 環境變量讀取 和 屬性對象的綁定

bean database 環境 autoconf lac autowire 屬性 boot title

凡是被spring管理的類,實現接口 EnvironmentAware 重寫方法 setEnvironment 可以在工程啟動時,獲取到系統環境變量和application配置文件中的變量。
如:

@Configuration
public class MyWebAppConfigurer implements EnvironmentAware
        {
    private static final Logger logger = LoggerFactory.getLogger(MyWebAppConfigurer.class);

    private RelaxedPropertyResolver propertyResolver;

    @Value("${spring.datasource.url}")
    private String myUrl;

    /**
     * 這個方法只是測試實現EnvironmentAware接口,讀取環境變量的方法。
     */
    @Override
    public void setEnvironment(Environment env) {
        logger.info(env.getProperty("JAVA_HOME"));
        logger.info(myUrl);
        String str = env.getProperty("spring.datasource.url");
        logger.info(str);
        propertyResolver = new RelaxedPropertyResolver(env, "spring.datasource.");
        String url = propertyResolver.getProperty("url");
        logger.info(url);
    }
}

@Controller @Service 等被Spring管理的類都支持,註意重寫的方法 setEnvironment 是在系統啟動的時候被執行。
或者如下Controller:

@Controller
public class PageController implements EnvironmentAware{

    @Override
    public void setEnvironment(Environment environment) {
        String s = environment.getProperty("JAVA_HOME");
        System.out.println(s);
    }
}

我們還可以通過@ConfigurationProperties 讀取application屬性配置文件中的屬性。

@Configuration
@ConditionalOnClass(Mongo.class)
@EnableConfigurationProperties(MongoProperties.class)
public class MongoAutoConfiguration {

    @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就不再創建。
@ConfigurationProperties(prefix = "spring.data.mongodb")
public class MongoProperties {

    private String host;
    private int port = DBPort.PORT;
    private String uri = "mongodb://localhost/test";
    private String database;

    // ... getters/ setters omitted
} 

它就是以spring.data.MongoDB作為前綴的屬性,然後通過名字直接映射為對象的屬性,同時還包含了一些默認值。如果不配置,那麽mongo.uri就是mongodb://localhost/test。

十五、Spring Boot 環境變量讀取 和 屬性對象的綁定