SpringBoot配置文件高级用法实战分享

 更新时间:2024年08月05日 09:08:14   作者:码到三十五  
Spring Boot配置文件的优先级是一个重要的概念,它决定了当存在多个配置文件时,哪个配置文件中的配置将被优先采用,本文给大家介绍了SpringBoot配置文件高级用法实战,文中通过代码介绍的非常详细,需要的朋友可以参考下

一、总体优先级顺序

  1. 命令行参数:通过命令行启动参数指定的配置拥有最高优先级。这包括java -jar命令后跟随的配置参数。

  2. 来自SPRING_APPLICATION_JSON的属性:嵌入在环境变量或系统属性中的JSON格式配置信息,优先级仅次于命令行参数。

  3. 系统属性:通过Java系统属性传递的配置值,例如使用-D参数设置的值。

  4. 环境变量:操作系统环境变量中的配置值。

  5. 随机生成的属性(仅用于开发中的随机端口号等):Spring Boot在开发环境中可以随机生成一些属性,例如随机端口号。

  6. 应用配置文件(application.propertiesapplication.yml:按照特定顺序加载的配置文件。

  7. @Configuration类中通过@PropertySource注解定义的属性:通过编程方式指定的配置文件。

  8. 默认属性(通过SpringApplication.setDefaultProperties指定的默认属性):这些属性在所有其他特定属性源之后加载,因此优先级最低。

二、应用配置文件的详细优先级

对于application.propertiesapplication.yml等应用配置文件,Spring Boot按照以下顺序加载,优先级从高到低:

  1. 命令行中指定的配置文件:通过--spring.config.location参数指定的配置文件。

  2. 项目目录下的config子目录:位于项目根目录下的config(和jar包同一目录)文件夹中的配置文件。

  3. 项目根目录:项目根目录(和jar包同一目录)下的配置文件。

  4. 类路径下的configsrc/main/resources/config目录中的配置文件。

  5. 类路径根目录src/main/resources目录中的配置文件。

特别注意的是,配置文件内容是在的合并的前提下执行优先级,即不重复的配置内容会合并!

三、文件类型优先级

在同一位置下,如果存在多种类型的配置文件(如.properties.yml.yaml),它们的优先级顺序为:

  • .properties
  • .yml
  • .yaml

四、特定环境配置

当使用特定环境的配置文件(如application-dev.ymlapplication-prod.yml)时,激活的特定环境配置文件将覆盖通用配置文件中的相同属性。如果指定了多个特定环境配置文件,则后面的配置文件将覆盖前面的配置文件中的相同属性。

五、配置文件高级用法

假设有以下配置文件:

类路径根目录下application.yml内容:

pack:
  name: root-name
  age: 11

类路径config包下application.yml内容:

pack:
  name: classpath/config-name

读取配置pack.namepack.age,输出结果为:

name = classpath/config-name, age = 11

这验证了配置文件内容的合并以及优先级规则。

5.1 修改配置文件名

使用spring.config.name环境属性可以修改默认的配置文件名:

java -jar springboot-configfile-1.0.0.jar --spring.config.name=pack

5.2 修改配置文件位置

使用spring.config.location环境属性指定配置文件的位置:

java -jar springboot-configfile-1.0.0.jar --spring.config.location=optional:classpath:/pack.yml,optional:classpath:/config/pack1.yml

使用optional:前缀可以忽略文件不存在的错误。也可以指定目录让Spring Boot自动拼接文件名:

java -jar springboot-configfile-1.0.0.jar --spring.config.location=optional:classpath:/config/ --spring.config.name=pack

5.3 使用文件系统路径

指定文件系统中的配置文件路径:

java -jar springboot-configfile-1.0.0.jar --spring.config.location=optional:classpath:/pack.yml,optional:file:f:/
--spring.config.name=pack

5.4 附加配置文件

如需要添加其它的配置文件,并非是替换默认的配置文件,可从附加位置加载属性(可以覆盖默认位置中的属性值)。

使用spring.config.additional-location加载额外的配置文件:

java -jar springboot-configfile-1.0.0.jar --spring.config.location=optional:classpath:/pack.yml --spring.config.name=pack --spring.config.additional-location=optional:file:f:/pack-akf.yml

5.5 可选位置

默认当指定的配置数据文件不存在时,SpringBoot会抛出ConfigDataLocationNotFoundException异常,应用程序将无法启动.

使用optional:前缀忽略配置文件不存在的错误:

java -jar springboot-configfile-1.0.0.jar --spring.config.location=optional:classpath:/pack.yml --spring.config.on-not-found=ignore

忽略所有ConfigDataLocationNotFoundException并始终继续启动应用程序,可以使用spring.config.on-not-found属性

六、多配置文件处理方式

背景需求

程序在部署的时候,一般是将配置文件放在jar包的外面,而当存在多个文件需要加载时,如项目中有:

cfg1.properties
cfg2.properties

解决方法一

合并所有配置文件至一个文件中配置加载,然后使用spring.config.location配置加载。
把cfg1.properties和cfg2.properties中的配置都合并至cfg.properties中。

java -jar app.jar --spring.config.location=file:/path/to/cfg.properties

解决方法二

保持文件的各自独立,使用spring.config.location属性来指定应用程序的配置文件路径。可以指定多个配置文件,使用逗号分隔的文件路径,例如:

java -jar api.jar --spring.config.location=file:/path/cfg1.properties,file:/path/cfg2.properties

到此这篇关于SpringBoot配置文件高级用法实战分享的文章就介绍到这了,更多相关SpringBoot配置文件用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Springboot与Maven多环境配置的解决方案

    Springboot与Maven多环境配置的解决方案

    多环境配置的解决方案有很多,我看到不少项目的多环境配置都是使用Maven来实现的,本文就实现Springboot与Maven多环境配置,感兴趣的可以了解下
    2021-06-06
  • SpringCloud大文件分片断点上传实现原理

    SpringCloud大文件分片断点上传实现原理

    这篇文章主要介绍了SpringCloud大文件分片断点上传实现原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • java多线程三种上锁方式小结

    java多线程三种上锁方式小结

    本文主要介绍了java多线程三种上锁方式小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-12-12
  • Spring Boot整合Thymeleaf详解

    Spring Boot整合Thymeleaf详解

    这篇文章主要介绍了Spring Boot整合Thymeleaf详解,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08
  • Java集合去重导致的线上问题

    Java集合去重导致的线上问题

    这篇文章主要介绍了Java集合去重导致的线上问题,根据主题提出Set是怎样保证数据的唯一性的,为什么两种去重方式性能差距这么大的问题,下文解决思路需要的小伙伴可以参考一下
    2022-04-04
  • 新手初学Java的内部类

    新手初学Java的内部类

    这篇文章主要介绍了java内部类原理与用法,结合实例形式分析了Java内部类的概念、原理、分类及相关使用技巧,需要的朋友可以参考下,希望能给你带来帮助
    2021-07-07
  • Spring配置动态数据源实现读写分离的方法

    Spring配置动态数据源实现读写分离的方法

    这篇文章主要介绍了利用Spring配置动态数据源实现读写分离的方法,文中通过示例代码介绍的很详细,相信对大家的理解和学习具有一定的参考借鉴价值,藕需要的朋友可以一起学习学习。
    2017-01-01
  • Java中的length和length()深入分析

    Java中的length和length()深入分析

    java中的length属性是针对数组说的,比如说你声明了一个数组,想知道这个数组的长度则用到了length这个属性。java中的length()方法是针对字符串String说的,如果想看这个字符串的长度则用到length()这个方法。这篇文章将介绍几个关于Java数组的关键概念。
    2016-11-11
  • SpringMVC如何获取表单数据(radio和checkbox)

    SpringMVC如何获取表单数据(radio和checkbox)

    这篇文章主要介绍了SpringMVC如何获取表单数据(radio和checkbox)的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • springboot如何初始化执行sql语句

    springboot如何初始化执行sql语句

    这篇文章主要介绍了springboot初始化执行sql语句的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06

最新评论