[!hint] 配置优先级 SpringBoot 中正常支持三种配置文件【
properties,yml,yaml】,如果一个项目中出现了多个配置文件配置相同属性的冲突,则它们的优先级排行是 命令行参数 > Java 系统属性 >properties>yml>yaml
properties 配置文件
[!quote] 参数配置化 参数配置化 是将项目中的参数定义在
properties文件中集中化管理,然后在 java 文件中使用@Value注解来注入配置文件中的值
- 未采用参数配置化:参数分散在各个类中,查找困难,而且这种硬编码的方式,在每次更改参数时都要重新编译项目
java
@RestController
public class Test {
public void test() {
String secretId = "AKIDtlYAZjRbefnkT4Siz8Zz";
String secretKey = "IOQKLDty66wcBlDTh";
String bucketName = "test-1307744200";
}
}- 采用参数配置化
java
public class Test {
@Value("${tencent.secretId}")
String secretId;
@Value("${tencent.secretKey}")
String secretKey;
@Value("${tencent.bucketName}")
String bucketName;
public void test() {
……
}
}properties
tencent.secretId=AKIDtlYAZjRbefnkT4Siz8Zz
tencent.secretKey=IOQKLDty66wcBlDTh
tencent.bucketName=test-1307744200yml 配置文件
- 大小写敏感
- 数值前面必须有
空格作为分割符 #表示注释
忽略语法检查 `#file: noinspection SpringBootApplicationYaml`
@ConfigurationProperties
使用该注释之后,会自动将配置文件中的值注入到 bean 对象对应的属性中去,简化了每次注入 yml 里的数值都要使用
@Value的麻烦
properties
tencent.secretId=AKIDtlYAZjRbefnkT4Siz8Zz
tencent.secretKey=IOQKLDty66wcBlDTh
tencent.bucketName=test-1307744200java
@Data //指定变量的get,set方法
@Component //将这个类交给IOC容器管理
@ConfigurationProperties(prefix = "tencent") //指定属性值的前缀
public class Test1 {
String secretId;
String secretKey;
String bucketName;
}java
public class Test2 {
@Autowired
private Test1 t1;
public void summart(){
String secretId = t1.getSecretId;
String secretKey = t1.getSecretKey;
String bucketName = t1.getBucketName;
……
}
}根据技术组件动态配置
比如,在 springboot 项目中,我有一个 application.yml 文件,还有一个 application-kafka.yml 文件,后续可能还有其他的组件配置,我想分开写,不想写在一个 yml 文件里,然后引入到总的 application.yml 中,要怎么操作
yml
spring:
profiles:
include: kafka
active: kafka根据部署环境动态配置
我们可以在不同的部署环境中动态地使用某个配置文件,就不用更换环境时改来改去
所有的配置文件:
application.yml主配置文件application-dev.yml开发环境配置文件application-prod.yml生产环境配置文件application-test.yml测试环境配置文件
yml
# application.yml
spring:
profiles:
active: dev # 会激活application-dev.yml,和dev profile组
group:
# 定义dev profile组
dev: dev-cache, dev-postgresql, dev-taoadmin
# 定义prod profile组
prod: prod-cache, prod-postgresql, prod-taoadmin外部配置
其实 SpringBoot 中还可以使用 Java 系统属性,或命令行参数 来配置项目属性,但是在项目中一般不使用
[!hint] 如果要在项目打包成
jar包后,非永久性的修改配置,可以使用 Java 系统属性,或命令行参数
- 运行
jar包- 在命令行运行
java -jar your-application.jar --server.port=8080