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

2023-05-05  本文已影响0人  开始懂了90

一、 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.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 命令指定要激活的环境,然后在应用程序中加载相应的配置文件或采取其他适应特定环境的操作。这样,您可以在不同的环境中轻松切换和管理应用程序的配置和行为。

上一篇 下一篇

猜你喜欢

热点阅读