刚才在研究公司的 Java 项目,发现 yml 配置有好多个,分别分为不同的场景,刚开始有点乱,Google了一圈,问了下 Gemini 和 GPT,简单的了解了一下
注:为保证项目的安全,本文的配置文件内容和名称均为自拟或比较普遍的名称
目前项目有几个关键的配置文件:
application.yml
application-test.yml
application-dev.yml
application-sms.yml
application-mail.yml
application-db-test.yml
application-db-dev.yml
主配置文件 application.yml 对于配置文件指定的内容大概是
server: port: 8848 # 应用名称 spring: application: name: admin-client profiles: active: test #开发环境 include: sms,mail
解析:这个配置文件里面包含了对服务端口的指定与其他关联配置文件的指定
server.port=8848 #字面意思,就是这个服务监听的端口 spring.application.name=admin-client #这个就是这个项目的名称 spring.profiles.active=test #这个是指定要启动哪个关联配置文件 spring.profiles.include=sms,mail #这个是指定要引入的配置文件,无论何时都会加载的,如果application-test.yml包含这个属性,则会合并(注意,不是覆盖,是合并!)
application-test.yml里面长这样~(这个在 Spring Boot 2.3.x 以上这么做是会报错的!)
spring: profiles: include: db-test #这个很简单,这是引用了 application-db-test.yml这个文件,这个就是对应的数据库配置
那有比较聪明的同学就问了,如果是两个配置文件一样,就比如说这样
application.yml
server: port: 8848 # 应用名称 spring: application: name: admin-client
application-test.yml
spring: application: name: guest-client
那么,这个配置怎么算?
这涉及到 Spring Boot 配置加载的一个非常重要的概念:配置属性的合并与覆盖。
application.yml 中指定加载 application-test.yml 的时候,application.yml 中的内容并不会被忽略掉,反而会合并到一起,并且 application-test.yml 中的配置会优先于 application.yml。
Spring Boot的配置加载规则
application.yml 会始终被加载,因为这个是所有配置的基础
application-{name}.yml 会在对应配置激活时被加载
如果存在相同的配置项,application-{name}.yml 会把 application.yml 中的这项配置覆盖掉
那么,这个配置最后就变成了
server: port: 8848 # 应用名称 spring: application: name: guest-client
拓展一下:
如何去取配置文件的内容
很简单,使用 @Value("${xxx.xxx}") 这个注解就可以啦~
就像酱紫~
@Value("${spring.application.name}") private String appName;
这就给自动赋值好啦,直接用吧~~

微信扫码查看本文
发表评论