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

我这里会看到以下输出:

  1. 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)
  2. 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。

但是这里有一个坑,你接着会看到:

  1. 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
  2. 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”的意思吧?

我去对应的目录下看了,文件确实存在的,怎么说是空的呢?

再往下找,往下看:

  1. 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'
  2. 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]'
  3. 2019/02/25-16:26:17 [main] DEBUG org.springframework.web.context.support.StandardServletEnvironment- Removing PropertySource 'applicationConfigurationProperties'
  4. 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

有很多文章从代码里面分析,搞的我一看就头大;

我这里只是简单的从日志输出来分析,

如果你还不满意,可以根据日志输出提示的类,

跟踪一下,看看代码上具体是怎么实现的!


posted on 2019-06-20 16:19  夜萤火虫和你  阅读(1522)  评论(0编辑  收藏  举报

导航