Spring Boot 环境变量读取 和 属性对象的绑定

Posted brucemengbm

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Boot 环境变量读取 和 属性对象的绑定相关的知识,希望对你有一定的参考价值。

凡是被Spring管理的类,实现接口 EnvironmentAware 重写方法 setEnvironment 能够在project启动时,获取到系统环境变量和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 环境变量读取 和 属性对象的绑定的主要内容,如果未能解决你的问题,请参考以下文章

十Spring Boot 环境变量读取 和 属性对象的绑定

[十六]SpringBoot 之 读取环境变量和绑定属性对象

在 Spring Boot 中读取环境变量

如何从环境变量绑定数据源属性 Spring boot

spring-boot骆驼案例嵌套属性作为环境变量

通过环境变量覆盖 Spring Boot yaml 属性