Spring Boot application.yml application.properties 优先级
转载:https://blog.csdn.net/testcs_dn/article/details/79010798
stackoverflow 上有个问题是:Can application.properties and application.yml be mixed?
Spring Boot 虽然做了大量的工作来简化配置,但其配置依然是相当的复杂!
支持的外部配置方式就高达 17 种之多,当然这很灵活,但灵活就意味着复杂度的提升。
这里只说说 application.yml 和 application.properties 两个文件的优先级
如果你的项目中存在 application.properties 文件,
那么 application.yml 文件就只是一个摆设。
为什么这么说呢?
我在 application.properties 文件中配置了:
server.port=8085
在 application.yml 文件中配置了:
server:
port: 8086
启动项目,控制台输出:
main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8085 (http)
充分说明了这一点。
你可能还会关注:application.properties 文件和 application.yml 文件有什么区别呢?
2018-09-26 更新
更新一下对这两个文件的认识,
其实 application.yml 文件会被优先加载,
而如果同时存在 application.properties 文件,并且存在相同的配置,
那么则会用 application.properties 文件中的配置覆盖之前的配置;
也就是说哪个文件被最后加载,哪个才具有最高级别,
因为最后的,会覆盖前面所有的。
2019-02-22 更新
一直比较懒,没去跟踪代码看看底层的究竟;
关注这个的人还挺多,但何必在这个问题上纠结呢!
喜欢哪种格式的就用哪种,不要让两种同时存在就好了。
2019-02-25 更新
有些人可能喜欢追求问题的根源,或者说真相,我这里也看看。
我的方法:
1、application.properties 文件中加入:
logging.level.root= debug
你在application.yml中也可以,注意格式。
2、Eclipse 控制台日志输出调大一点,不然可能显示不全
控制台窗口空白处右键,首选项
3、启动项目
查找 application.properties 或者 application.yml
我这里会看到以下输出:
- 2019/02/25-16:25:46 [main] DEBUG org.springframework.boot.context.config.ConfigFileApplicationListener- Loaded config file 'file:/Users/aven/Documents/workspace/fams/fams/target/classes/application.properties' (classpath:/application.properties)
- 2019/02/25-16:25:46 [main] DEBUG org.springframework.boot.context.config.ConfigFileApplicationListener- Loaded config file 'file:/Users/aven/Documents/workspace/fams/fams/target/classes/application.yml' (classpath:/application.yml)
可以看到,从加载顺序上是:先 application.properties 后 application.yml。
但是这里有一个坑,你接着会看到:
- 2019/02/25-16:25:46 [main] DEBUG org.springframework.boot.context.config.ConfigFileApplicationListener- Skipped (empty) config file 'file:/Users/aven/Documents/workspace/fams/fams/target/classes/application.properties' (classpath:/application.properties) for profile default
- 2019/02/25-16:25:46 [main] DEBUG org.springframework.boot.context.config.ConfigFileApplicationListener- Skipped (empty) config file 'file:/Users/aven/Documents/workspace/fams/fams/target/classes/application.yml' (classpath:/application.yml) for profile default
Skipped (empty) config file xxx for profile default
我E文不好,这是“跳过(空)配置文件xxx”的意思吧?
我去对应的目录下看了,文件确实存在的,怎么说是空的呢?
再往下找,往下看:
- 2019/02/25-16:26:17 [main] DEBUG org.springframework.web.context.support.StandardServletEnvironment- Adding PropertySource 'applicationConfig: [classpath:/application.properties]' with search precedence immediately lower than 'applicationConfigurationProperties'
- 2019/02/25-16:26:17 [main] DEBUG org.springframework.web.context.support.StandardServletEnvironment- Adding PropertySource 'applicationConfig: [classpath:/application.yml]' with search precedence immediately lower than 'applicationConfig: [classpath:/application.properties]'
- 2019/02/25-16:26:17 [main] DEBUG org.springframework.web.context.support.StandardServletEnvironment- Removing PropertySource 'applicationConfigurationProperties'
- 2019/02/25-16:26:17 [main] DEBUG org.springframework.web.context.support.StandardServletEnvironment- Removing PropertySource 'defaultProperties'
Adding PropertySource 'applicationConfig: [classpath:/application.yml]' with search precedence immediately lower than 'applicationConfig: [classpath:/application.properties]'
这是说 application.yml 的优先级低于 application.properties 吧?
到这里结果是不是很明确了呢?
噢,对了,我的版本是:spring-boot-1.5.9.RELEASE
有很多文章从代码里面分析,搞的我一看就头大;
我这里只是简单的从日志输出来分析,
如果你还不满意,可以根据日志输出提示的类,
跟踪一下,看看代码上具体是怎么实现的!