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