SpringBoot详细讲解多个配置文件的配置流程

 更新时间:2022年06月08日 10:40:37   作者:索码理  
SpringBoot项目是一个标准的Maven项目,它的配置文件需要放在src/main/resources/下,其文件名必须为application,其存在两种文件形式,分别是properties和yaml(或者yml)文件

一般情况下,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项目

启动类如下:

@SpringBootApplication
public 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=classpath
server.port=8080

为了验证 springboot 2.4.0之前和之后的版本加载顺序的不一样,会使用两个版本对比。

对比版本:springboot 2.4.3 和 springboot 2.3.5.RELEASE

下面是不同路径下配置不同端口和应用名以便验证。

路径端口号application.name
file:./config/*/8084file:./config/*/
file:./config/8083file:./config/
file:./8082file:./
classpath:config/8081classpath:config/
classpath:8080classpath:

验证配置文件加载顺序

根据上述表格,将配置文件分别复制到不同的路径下创建配置文件并按表格修改spring.application.name和server.port属性值。

启动项目,下面是两个版本的启动信息:

从两张图中可以得出结论:

  • springboot 2.4.0前后配置文件加载顺序不一样
  • 高优先级的会覆盖掉低优先级相同的属性

验证属性互补

修改配置文件:

classpath:配置文件

删除spring.application.name属性,增加server.error.path属性

server.port=8080
server.error.path=/test

file:./配置文件

新增server.servlet.context-path属性

spring.application.name=file:.
server.port=8082
server.servlet.context-path=file_context

file:./config/*/配置文件

保持不变

server.port=8084
spring.application.name=file:./config/*/

修改启动类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);
	}

启动项目

从上面截图中可以发现三个配置文件中的所有属性都被加载出来了,而且优先级高的配置文件中的属性会覆盖优先级低的配置文件中的属性。

总结

springboot中可以配置多个配置文件,并且这些配置文件是可以共存的。当属性相同时,优先级高的配置文件会覆盖优先级低的配置文件中的属性;当属性不同时,最终的配置会取各个配置文件中属性的并集。

到此这篇关于SpringBoot详细讲解多个配置文件的配置流程的文章就介绍到这了,更多相关SpringBoot配置文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MybatisPlus多表连接查询的问题及解决方案

    MybatisPlus多表连接查询的问题及解决方案

    MybatisPlus官方并没有提供多表连接查询的通用解决方案,然而连接查询是相当普遍的需求,今天通过本文给大家介绍下MybatisPlus多表连接查询的问题及解决方案,感兴趣的朋友一起看看吧
    2022-01-01
  • springboot项目配置logback日志系统的实现

    springboot项目配置logback日志系统的实现

    这篇文章主要介绍了springboot项目配置logback日志系统的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • 如何实现java Iterator迭代器功能

    如何实现java Iterator迭代器功能

    这篇文章主要介绍了如何实现java Iterator迭代器功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • Java如何将String转换成json对象或json数组

    Java如何将String转换成json对象或json数组

    这篇文章主要介绍了Java如何将String转换成json对象或json数组,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • Java使用WeakHashMap实现缓存自动清理

    Java使用WeakHashMap实现缓存自动清理

    在 Java 中,内存管理是一个重要的话题,尤其是在涉及到缓存的实现时,如果缓存项不再被使用,我们希望它们能被自动清理,而不必手动删除,WeakHashMap 就是 Java 提供的一种用于缓存和内存管理的工具,本文将深入探讨如何利用 WeakHashMap 来实现缓存自动清理
    2025-01-01
  • java网络编程之识别示例 获取主机网络接口列表

    java网络编程之识别示例 获取主机网络接口列表

    一个客户端想要发起一次通信,先决条件就是需要知道运行着服务器端程序的主机的IP地址是多少。然后我们才能够通过这个地址向服务器发送信息。
    2014-01-01
  • Java连接服务器的两种方式SFTP和FTP

    Java连接服务器的两种方式SFTP和FTP

    在项目开发中,一般文件存储很少再使用SFTP服务,但是也不排除合作伙伴使用SFTP来存储项目中的文件或者通过SFTP来实现文件数据的交互,这篇文章主要介绍了Java集成FTP与SFTP连接池
    2023-02-02
  • Java实现跳转到指定页面的方法小结

    Java实现跳转到指定页面的方法小结

    在Java中,实现页面跳转主要涉及到Web开发,而这通常通过使用Java的Web框架(如Servlet、Spring MVC)来完成,下面讲解一下如何在不同的Java Web框架中实现页面跳转,文中有详细的代码示例供大家参考,需要的朋友可以参考下
    2024-05-05
  • Redisson分布式闭锁RCountDownLatch的使用详细讲解

    Redisson分布式闭锁RCountDownLatch的使用详细讲解

    分布式锁和我们java基础中学习到的synchronized略有不同,synchronized中我们的锁是个对象,当前系统部署在不同的服务实例上,单纯使用synchronized或者lock已经无法满足对库存一致性的判断。本次主要讲解基于rediss实现的分布式锁
    2023-02-02
  • 不知道面试会不会问Lambda怎么用(推荐)

    不知道面试会不会问Lambda怎么用(推荐)

    这篇文章主要介绍了Lambda表达式用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04

最新评论