Spring Boot 的参数配置除了使用 properties 文件之外,还可以使用 yml 文件。如果你喜欢用 yml 格式的配置文件可以将 application.properties 修改为 application.yml 。
Spring Boot 应用程序有多种设置途径。Spring Boot 能从多种属性源获得属性,包括如下几处:
这个列表按照优先级排序,也就是说,任何在高优先级属性源里设置的属性都会覆盖低优先级属性源里设置的相同属性。例如,命令行参数会覆盖其它属性源里的属性。
application.properties 和 application.yml 文件能放下如下四个位置:
同样,这个列表也是按照优先级排序。也就是说,/config 子目录里 application.properties 会覆盖应用程序 classpath 里的 application.properties 中的相同属性。
springboot 本身支持多种灵活的配置方式,为开发 springboot 程序带来了很大的灵活性和扩展性,但是同时由于太灵活,经常会导致明明配置了相关属性,却没有生效。本文总结了 springboot 配置文件的原理以及多个配置文件生效的顺序。
springboot 配置文件支持灵活的路径,以及灵活的文件名,用一个变量表达式总结如下:
部分源码如下:
当满足上述变量表达式的配置文件有多个时,会有一个配置的优先级。假设
上面每个条件组合起来,则最多有配置文件如下,且顺序从上到下:
获取属性时,按从上到下的顺序遍历由上述文件生成的属性资源对象 PropertySource ,如果遇到匹配的key直接返回。
总结一下:就是如果同一个key的属性只出现一次,则直接取该值即可。如果同一个key的属性出现多次,则取顺序靠前的属性资源对象。另外其中每个文件都是可选的。
需要注意的一点是:如果在同一个 location 下配置了多个文件名一样的文件,则只会取一个,比如在 classpath:/ ,有如下两个文件 application.yml :
则只会根据 classloader 的 classpath 列表,选取第一个出现的文件。因为 springboot 加载配置文件时最底层是使用的下面的方法:
这两个方法只会获取 classloader 类的 ucp 属性里面第一个匹配到的值。如果对 springboot 自身的机制不满意,想获取所有的classpath:/路径下面的 applicaiton.yml 文件,可以使用下面的方法:
本文总结了 springboot 配置文件的原理以及多个配置文件生效的顺序。如果存在增加了配置文件或者在配置文件里面增加了属性却没有生效,可以参考上面的 springboot 配置文件表达式和配置文件生效顺序进行排查。
后面还会有一篇文章讨论基于 springboot 配置原理如何实现自定义的配置读取方式。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)