Skip to content

[!hint] 配置优先级 SpringBoot 中正常支持三种配置文件【propertiesymlyaml】,如果一个项目中出现了多个配置文件配置相同属性的冲突,则它们的优先级排行是 命令行参数 > 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-1307744200

yml 配置文件

  • 大小写敏感
  • 数值前面必须有 空格 作为分割符
  • # 表示注释

忽略语法检查 `#file: noinspection SpringBootApplicationYaml`

@ConfigurationProperties

使用该注释之后,会自动将配置文件中的值注入到 bean 对象对应的属性中去,简化了每次注入 yml 里的数值都要使用 @Value 的麻烦

properties
tencent.secretId=AKIDtlYAZjRbefnkT4Siz8Zz  
tencent.secretKey=IOQKLDty66wcBlDTh  
tencent.bucketName=test-1307744200
java
@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