springboot 外部配置文件的引入

一般情况下 , springboot默认会在resource目录下生成一个配置文件(Application.properties或application.yaml),但其实springboot允许配置多个配置文件(application.properties或application.yaml) , 但是这并不意味着这些配置文件一定会替换默认生成的配置文件 , 它们是互补的存在 。如果在某些场景下需要把配置文件单独拿出来并且启动的时候加载进去 , 那么外部的配置文件将是一个很好的选择 。
配置文件加载顺序需要注意的是配置文件加载顺序加载顺序在springboot 2.4.0前后是不一样的 。

  • springboot 2.4.0及其之前版本的配置文件加载顺序
file:./config/file:./config/*/file:./classpath:config/classpath:复制代码
  • springboot 2.4.0之后版本的配置文件加载顺序
file:./config/*/file:./config/file:./classpath:config/classpath:复制代码区别在于springboot 2.4.0之后的版本将file:./config/*/的在顺序调整为第一加载顺序 。
file是指当前jar包所在路径 。
classpath是指springboot resource文件夹下路径 。
验证前期准备
  • 新建一个springboot项目
    启动类如下:
@SpringBootApplicationpublic class MqApplication {public static void main(String[] args) {ConfigurableApplicationContext applicationContext = SpringApplication.run(MqApplication.class, args);ConfigurableEnvironment environment = applicationContext.getEnvironment();String property = environment.getProperty("spring.application.name");System.out.println("current spring.application.name="+property);}}复制代码配置文件:
spring.application.name=classpathserver.port=8080复制代码为了验证 springboot 2.4.0之前和之后的版本加载顺序的不一样 , 会使用两个版本对比 。对比版本:springboot 2.4.3 和 springboot 2.3.5.RELEASE
下面是不同路径下配置不同端口和应用名以便验证 。
路径
端口号
application.name
file:./config/*/
8084
file:./config/*/
file:./config/
8083
file:./config/
file:./
8082
file:./
classpath:config/
8081
classpath:config/
classpath:
8080
classpath:
验证配置文件加载顺序根据上述表格 , 将配置文件分别复制到不同的路径下创建配置文件并按表格修改spring.application.name和server.port属性值 。
启动项目 , 下面是两个版本的启动信息:
springboot 外部配置文件的引入

文章插图
 

springboot 外部配置文件的引入

文章插图
 
从两张图中可以得出结论:
  1. springboot 2.4.0前后配置文件加载顺序不一样
  2. 高优先级的会覆盖掉低优先级相同的属性
验证属性互补
  1. 修改配置文件:
  • classpath:配置文件
    删除spring.application.name属性 , 增加server.error.path属性
server.port=8080server.error.path=/test复制代码
  • file:./配置文件
    新增server.servlet.context-path属性
spring.application.name=file:.server.port=8082server.servlet.context-path=file_context复制代码
  • file:./config/*/配置文件
    保持不变
server.port=8084spring.application.name=file:./config/*/复制代码
  1. 修改启动类main方法
    在控制台打印server.error.path
public static void main(String[] args) {ConfigurableApplicationContext applicationContext = SpringApplication.run(MqApplication.class, args);ConfigurableEnvironment environment = applicationContext.getEnvironment();String property = environment.getProperty("spring.application.name");System.out.println("current spring.application.name="+property);String errorPath = environment.getProperty("server.error.path");System.out.println("errorPath="+errorPath);}复制代码
  1. 启动项目
从上面截图中可以发现三个配置文件中的所有属性都被加载出来了 , 而且优先级高的配置文件中的属性会覆盖优先级低的配置文件中的属性 。


推荐阅读