面试官问:说说SpringBoot配置文件的加载顺序?

引言

如果我们了解SpringBoot配置文件的加载顺序,对项目的开发和部署会有很大的帮助。举个工作中的例子,我们的项目是微服务架构模式,用Nacos做注册中心(可以配置每个微服务),所有服务请求需要通过网关,由网关做统一的鉴权和路由转发。环境有三套,本地环境、测试环境、网络环境。

每套环境都有自己的Nacos配置和数据库配置,难道我们每次打包到不同环境都有修改完配置文件再打包?开发的时候再一个一个改回来?答案当然是:No。

So,了解SpringBoot配置文件的加载顺序还是很有必要的。

SpringBoot配置文件的加载顺序

1、项目内配置文件加载顺序

SpringBoot项目启动会扫描以下位置的application.properties或者application.yml文件作为SpringBoot的默认配置文件,具体的目录位置见下图。

file:./config/ ( 项目根路径下的config文件夹)
file:./ (项目根路径)
classpath:/config/ (类路径下的config文件夹)
classpath:/ (类路径)

adb3ccd673ccf0e7948fe5027ae86552.png

四个位置的配置文件中端口分别配置为:8081、8082、8083、8084。并启动程序,发现8081端口起作用。

ca9432fc676b8c72dc125c70aa976d63.png

从上面的位置,逐一注释掉配置文件中的配置项,启动项目,会发现配置文件逐一会起作用。下面是注释掉8081的配置,启动项目后,发现8082会起作用。可以逐一注释验证。

be2cd2c3347185a990a8837355b33b90.png

上面四个位置的配置文件位置,优先级由高到底,高优先级的配置会覆盖低优先级的配置,没有的配置进行互补配置。

注意:不是类路径下的配置文件在打包时,如果不做配置是不会打包进jar中的,也会是说前两个配置在项目打包后,包中是不存在的,所以尽量不要用前两个位置。

2、外部配置文件

当我们把项目打包后,如何在配置SpringBoot项目呢?

1)命令行参数

项目打包好以后,我们可以使用命令行参数的形式,来改变想改变的几个参数,直接在启动命令后添加启动参数,如果有多个配置项,可以用空格分开。

6606d10e90553d2a8ccd2fb9f73b7fec.png

2)spring.config.location

在第一种情况下,如果参数数量过多,我们就要考虑配置文件了,我们在启动项目的时候可以用spring.config.location来指定配置文件的新位置。指定的配置文件和jar包中默认加载的配置文件共同起作用形成互补配置。

指定配置文件从F盘下读取

java -jar springboot-configuration.jar --spring.config.location=F:/application.properties
3、配置文件加载顺序小结

外部配置加载顺序SpringBoot也可以从以下位置加载配置:

优先级从高到低,高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置 。

  1. 命令行参数。所有的配置都可以在命令行上进行指定;

  2. 来自java:comp/env的JNDI属性;

  3. Java系统属性(System.getProperties());

  4. 操作系统环境变量 ;

  5. jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件

  6. jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件 再来加载不带profile

  7. 推荐面试宝典:https://www.yoodb.com/

  8. jar包外部的application.properties或application.yml(不带spring.profile)配置文件

  9. jar包内部的application.properties或application.yml(不带spring.profile)配置文件

  10. @Configuration注解类上的@PropertySource

根据第7条,我们只要在jar包同目录外放置一个application.properties配置文件,就会起作用,同时这个配置文件的优先级还比jar内的高,这个配置很有作用!!Spring注解大全系列教程:https://www.yoodb.com/spring/spring-annotate.html

d444398ed45e3e76c3c3db7e72fe747c.png

具体可以参看官方文档:

https://docs.spring.io/spring-boot/docs/2.1.11.RELEASE/reference/html/boot-features-external-config.html

作者:止步前行

https://blog.csdn.net/zxd1435513775/article/details/103773404

 
 
公众号“Java精选”所发表内容注明来源的,版权归原出处所有(无法查证版权的或者未注明出处的均来自网络,系转载,转载的目的在于传递更多信息,版权属于原作者。如有侵权,请联系,笔者会第一时间删除处理!
最近有很多人问,有没有读者交流群!加入方式很简单,公众号Java精选,回复“加群”,即可入群!

Java精选面试题(微信小程序):3000+道面试题,包含Java基础、并发、JVM、线程、MQ系列、Redis、Spring系列、Elasticsearch、Docker、K8s、Flink、Spark、架构设计等,在线随时刷题!
------ 特别推荐 ------
特别推荐:专注分享最前沿的技术与资讯,为弯道超车做好准备及各种开源项目与高效率软件的公众号,「大咖笔记」,专注挖掘好东西,非常值得大家关注。点击下方公众号卡片关注。

点击“阅读原文”,了解更多精彩内容!文章有帮助的话,点在看,转发吧!
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值