Spring Boot支持哪些命名格式的配置文件及加载优先级顺序

一、 Spring Boot支持以下命名格式的配置文件:

  1. application.properties
    这是最常用的配置文件格式,使用基于键值对的格式进行配置。可以在其中定义各种应用程序的配置属性,如数据库连接、服务器端口等。

  2. application.yml
    这是另一种常用的配置文件格式,使用基于缩进的YAML(YAML Ain't Markup Language)格式进行配置。相比于application.propertiesapplication.yml可以提供更加简洁和易读的配置方式。

  3. application-{profile}.propertiesapplication-{profile}.yml
    使用Spring Profiles(配置文件激活的一种方式)时,可以为每个配置文件配置特定的激活配置文件的属性。例如,application-dev.propertiesapplication-prod.yml,可以根据不同的激活配置文件加载不同的属性。

  4. bootstrap.propertiesbootstrap.yml
    这些配置文件类似于application.propertiesapplication.yml,但是它们在应用程序的引导阶段加载。它们主要用于配置一些早期的、基础的配置项,如连接远程配置服务器、配置加密解密等。

此外,Spring Boot还支持其他命名格式的配置文件,如:

  • application.xml:使用XML格式进行配置。尽管XML格式不是Spring Boot的首选格式,但如果你更喜欢使用XML配置,仍然可以使用。

你可以根据项目需求选择适合的配置文件格式,一般推荐使用application.propertiesapplication.yml格式,因为它们在Spring Boot社区中使用广泛,并提供了简单和灵活的配置方式。

二、在Spring Boot中,不同命名格式的配置文件具有不同的优先级。以下是配置文件优先级的描述(从高到低):

  1. 命令行参数(Command Line Arguments):
    命令行参数的优先级最高。通过命令行传递的参数可以覆盖其他配置文件中的相同属性。

  2. bootstrap.ymlbootstrap.properties
    如果存在bootstrap.ymlbootstrap.properties文件,它们会在应用程序的引导阶段加载。这些配置文件中的属性将覆盖其他配置文件中的相同属性。

  3. application-{profile}.ymlapplication-{profile}.properties
    激活的特定配置文件(Profile-specific)具有比普通的application.ymlapplication.properties更高的优先级。例如,application-dev.yml中的属性将覆盖application.yml中的相同属性。

  4. application.ymlapplication.properties
    application.ymlapplication.properties是最常见的配置文件。它们包含应用程序的核心配置。如果没有激活的特定配置文件,这些文件中的属性将被加载并应用于应用程序。

总结起来,命令行参数具有最高优先级,其次是bootstrap.ymlbootstrap.properties,然后是激活的特定配置文件,最后是通用的application.ymlapplication.properties

需要注意的是,Spring Boot还支持使用@ConfigurationProperties注解将属性绑定到Java对象上,以及使用@Value注解将属性绑定到特定的字段或方法参数上。这些方式可以提供更精细的属性控制和灵活性。

三、命令行参数举例
当使用命令行参数时,可以通过在运行应用程序时传递--<property-name>=<value>的方式来覆盖配置文件中的属性。

例如,假设有一个名为application.properties的配置文件,其中定义了一个属性app.message

app.message=Hello World

如果希望在运行应用程序时覆盖该属性的值,可以使用以下命令行参数:

java -jar myapp.jar --app.message=Hello Kaishidongle

通过上述命令行参数,app.message的值将被覆盖为"Hello Kaishidongle",而不是配置文件中的"Hello World"。

在应用程序中,可以通过使用@Value注解或Environment对象来获取命令行参数的值。例如,可以在Spring Bean中使用@Value注解注入属性值:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class MyComponent {
    @Value("${app.message}")
    private String message;

    // ...
}

在上述例子中,message属性的值将是从命令行参数中传递的值,即"Hello Kaishidongle"。这样,通过命令行参数覆盖了配置文件中的属性值。

四、文件具有相同属性时加载顺序
当多个配置文件共存时,它们的加载顺序和优先级如下:

  1. 命令行参数(Command Line Arguments):
    命令行参数的优先级最高,可以覆盖其他配置文件中的相同属性。

  2. bootstrap.ymlbootstrap.properties
    如果存在bootstrap.ymlbootstrap.properties文件,它们会在应用程序的引导阶段加载,并覆盖其他配置文件中的相同属性。

  3. 激活的特定配置文件(Profile-specific):
    如果存在激活的特定配置文件,如application-dev.yml,它将覆盖普通的application.ymlapplication.properties中的相同属性。

  4. application.ymlapplication.properties
    如果没有激活的特定配置文件,这些通用的配置文件中的属性将被加载并应用于应用程序。

在加载的过程中,后面的配置文件会覆盖前面的配置文件中的相同属性。因此,如果多个配置文件中定义了相同的属性,最后被加载的配置文件中的属性值将生效。

例如,假设存在以下配置文件:

  1. application.properties

    app.message=Hello World
    
  2. application-dev.properties

    app.message=Hello Dev
    
  3. bootstrap.properties

    app.message=Hello Bootstrap
    

在这种情况下,如果激活了dev配置文件,并且没有通过命令行参数进行覆盖,那么最终生效的属性值将是Hello Dev。因为激活的特定配置文件具有比通用的配置文件和bootstrap.properties更高的优先级。

需要注意的是,如果使用@Value注解或Environment对象获取属性值时,会优先使用命令行参数的值。如果命令行参数中没有定义该属性,才会使用配置文件中的属性值。

综上所述,多个配置文件共存时,根据加载顺序和优先级确定最终生效的属性值。命令行参数具有最高优先级,特定配置文件具有较高优先级,通用配置文件和bootstrap.properties具有较低优先级。

五、多环境配置
多环境配置是使用不同的配置文件来适应不同的部署环境。以下是一些常见的多环境配置的示例:

  1. 开发环境(dev):

    • application-dev.yml:包含开发环境的配置,如数据库连接信息、调试日志级别等。
    • application.yml:通用配置文件,可能包含一些默认值或共享的配置。
  2. 测试环境(test):

    • application-test.yml:包含测试环境的配置,如测试数据库连接信息、测试数据初始化脚本等。
    • application.yml:通用配置文件。
  3. 生产环境(prod):

    • application-prod.yml:包含生产环境的配置,如生产数据库连接信息、生产环境的缓存策略、日志输出路径等。
    • application.yml:通用配置文件。

在这种配置下,通过设置 spring.profiles.active 属性来指定当前活动的配置环境。例如,在开发环境中,可以将 spring.profiles.active 设置为 dev,然后应用程序将加载 application-dev.ymlapplication.yml 中的配置。类似地,可以通过设置 spring.profiles.activetestprod 来加载相应环境的配置。

使用多环境配置,可以轻松切换和管理不同环境下的配置,确保应用程序在不同的部署环境中具有正确的配置和行为。
六、存在nacos配置时 文件加载顺序

  1. 当 Nacos 和本地都存在相同的配置时,优先加载 Nacos 上的配置。
  2. user-dev.yaml (nacos) > user.yaml(nacos) > application.yml (本地)


    image.png

七、 mvn设置不同的 Maven Profiles 来指定环境
使用 Maven 构建工具,您可以通过设置不同的 Maven Profiles 来指定环境。

以下是一种常见的方式来使用 Maven 设置环境:

  1. 在 Maven 的 pom.xml 文件中定义不同的 Profiles。在 <profiles> 标签下,您可以为每个环境定义一个 Profile。例如:
<profiles>
  <profile>
    <id>dev</id>
    <activation>
      <activeByDefault>true</activeByDefault>
    </activation>
    <properties>
      <env>dev</env>
    </properties>
  </profile>
  <profile>
    <id>test</id>
    <properties>
      <env>test</env>
    </properties>
  </profile>
  <profile>
    <id>prod</id>
    <properties>
      <env>prod</env>
    </properties>
  </profile>
</profiles>

上述示例定义了三个不同的 Profiles:devtestproddev Profile 被设置为默认激活的 Profile。

  1. 在 Maven 构建命令中指定要激活的 Profile。通过在 Maven 命令中使用 -P 参数来激活特定的 Profile。例如:
mvn clean install -P test

上述命令将使用 test Profile 进行构建。这会触发激活 test Profile 中定义的配置和插件。

  1. 在项目的配置文件中使用 ${env} 占位符引用环境变量。在您的项目配置文件(如 application.ymlapplication.properties)中,您可以使用 ${env} 占位符引用激活的环境变量。例如:
spring:
  profiles:
    active: ${env}

通过上述配置,spring.profiles.active 属性的值将根据激活的 Maven Profile 动态设置。

通过这种方式,您可以使用 Maven 命令指定要激活的环境,然后在应用程序中加载相应的配置文件或采取其他适应特定环境的操作。这样,您可以在不同的环境中轻松切换和管理应用程序的配置和行为。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容