YAML 配置与调用
一个项目通常会有多个环境,YAML 文件可以更好的管理,甚至可以在无需重新打包的情况下更改环境。

调用

Value 注解调用

例如,YAML 文件中有个自定义配置。

myconfig:
  model-server-url: 127.0.0.1

使用 @Value 注解调用。

import org.springframework.beans.factory.annotation.Value;

@Value("${myconfig.model-server-url}")
private String modelServerUrl;

变量少的情况,代码相对简单,但当变量被多次调用的情况下,可以考虑用类包装一下,下面的就是采用这种逻辑。

ConfigurationProperties 注解调用

当参数较多时,可以使用 @ConfigurationProperties 将其绑定到一个类中。例如

myconfig:
  model-server-url: 127.0.0.1
  servers: 
    - www.abc.test.com
    - www.xyz.test.com

配置类代码如下:


import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;

/**
 * yaml config
 *
 */
@Configuration
@EnableConfigurationProperties
@ConfigurationProperties(prefix = "myconfig")
public class YAMLConfig {

    private String modelServerUrl;
    private List<String> servers = new ArrayList<>();

    // standard getters and setters
}

其中 @Configuration@EnableConfigurationProperties 可以用 @Component 代替,前面那种注解更精确些。

YAML 文件中参数匹配很宽松,下划线 _- 和驼峰都能够匹配到,官方建议使用 -

调用时直接通过 @Autowired 注入即可,例如

@Autowired
private YAMLConfig yamlConfig;

@GetMapping("/hello")
@ResponseBody
String hello(){
    return "hello and url: " + yamlConfig.getModelServerUrl() + " and servers: " + yamlConfig.getServers();
}

多环境使用

通常线上环境和测试环境的配置会有不同,有时候搞混的话,部署到线上才发觉,这时又得重新打包了。若是配置写在 YAML 文件中,可以使用命令行参数进行配置更改。

命令行直接配置

如上述例中参数想要替换成 127.0.0.2,启动命令如下;

java -jar demo.jar --myconfig.model-server-url=127.0.0.2

可以看到有很多地方可以配置,那么这些肯定会有个优先级,这种命令行的形式应该是最高的,目前没有深入了解。

单文件多配置

上述命令行直接配置的方式肯定不适用于参数多的情况,这时就需要用到了 profile 参数,例如:

spring:
  profiles:
    active: test
---
spring:
  profiles: test
myconfig:
  model-server-url: 127.0.0.1
  server-name: test

---
spring:
  profiles: prod
myconfig:
  model-server-url: 127.0.0.2
  server-name: prod

这里 --- 表示新文档的开始,所以其实是三个环境写到一起。一开始的默认配置是选择 test,如果想要换成 prod,则启动命令更改如下:

java -jar demo.jar --spring.profiles.active=prod

多文件多配置

当配置越来越多时,还是分开不同文件更好些,Spring Boot 秉承着 约定优于配置 的理念,如果按照其规范来,会相当便利。

如上述例子可以分为文件 application.yml、文件 application-test.yml 和文件 application-prod.yml

application.yml

spring:
  profiles:
    active: test

application-test.yml

myconfig:
  model-server-url: 127.0.0.1
  server-name: test

application-prod.yml

myconfig:
  model-server-url: 127.0.0.2
  server-name: prod

尾巴

个人觉得 YAML 配置不同环境挺适合的,如果是静态常量,感觉还是静态类写死更方便些。

参考:


Last modified on 2020-09-07