一、 Spring Boot支持以下命名格式的配置文件:
application.properties
:
这是最常用的配置文件格式,使用基于键值对的格式进行配置。可以在其中定义各种应用程序的配置属性,如数据库连接、服务器端口等。application.yml
:
这是另一种常用的配置文件格式,使用基于缩进的YAML(YAML Ain't Markup Language)格式进行配置。相比于application.properties
,application.yml
可以提供更加简洁和易读的配置方式。application-{profile}.properties
或application-{profile}.yml
:
使用Spring Profiles(配置文件激活的一种方式)时,可以为每个配置文件配置特定的激活配置文件的属性。例如,application-dev.properties
或application-prod.yml
,可以根据不同的激活配置文件加载不同的属性。bootstrap.properties
或bootstrap.yml
:
这些配置文件类似于application.properties
和application.yml
,但是它们在应用程序的引导阶段加载。它们主要用于配置一些早期的、基础的配置项,如连接远程配置服务器、配置加密解密等。
此外,Spring Boot还支持其他命名格式的配置文件,如:
-
application.xml
:使用XML格式进行配置。尽管XML格式不是Spring Boot的首选格式,但如果你更喜欢使用XML配置,仍然可以使用。
你可以根据项目需求选择适合的配置文件格式,一般推荐使用application.properties
或application.yml
格式,因为它们在Spring Boot社区中使用广泛,并提供了简单和灵活的配置方式。
二、在Spring Boot中,不同命名格式的配置文件具有不同的优先级。以下是配置文件优先级的描述(从高到低):
命令行参数(Command Line Arguments):
命令行参数的优先级最高。通过命令行传递的参数可以覆盖其他配置文件中的相同属性。bootstrap.yml
或bootstrap.properties
:
如果存在bootstrap.yml
或bootstrap.properties
文件,它们会在应用程序的引导阶段加载。这些配置文件中的属性将覆盖其他配置文件中的相同属性。application-{profile}.yml
或application-{profile}.properties
:
激活的特定配置文件(Profile-specific)具有比普通的application.yml
或application.properties
更高的优先级。例如,application-dev.yml
中的属性将覆盖application.yml
中的相同属性。application.yml
或application.properties
:
application.yml
或application.properties
是最常见的配置文件。它们包含应用程序的核心配置。如果没有激活的特定配置文件,这些文件中的属性将被加载并应用于应用程序。
总结起来,命令行参数具有最高优先级,其次是bootstrap.yml
或bootstrap.properties
,然后是激活的特定配置文件,最后是通用的application.yml
或application.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"。这样,通过命令行参数覆盖了配置文件中的属性值。
四、文件具有相同属性时加载顺序
当多个配置文件共存时,它们的加载顺序和优先级如下:
命令行参数(Command Line Arguments):
命令行参数的优先级最高,可以覆盖其他配置文件中的相同属性。bootstrap.yml
或bootstrap.properties
:
如果存在bootstrap.yml
或bootstrap.properties
文件,它们会在应用程序的引导阶段加载,并覆盖其他配置文件中的相同属性。激活的特定配置文件(Profile-specific):
如果存在激活的特定配置文件,如application-dev.yml
,它将覆盖普通的application.yml
或application.properties
中的相同属性。application.yml
或application.properties
:
如果没有激活的特定配置文件,这些通用的配置文件中的属性将被加载并应用于应用程序。
在加载的过程中,后面的配置文件会覆盖前面的配置文件中的相同属性。因此,如果多个配置文件中定义了相同的属性,最后被加载的配置文件中的属性值将生效。
例如,假设存在以下配置文件:
-
application.properties
:app.message=Hello World
-
application-dev.properties
:app.message=Hello Dev
-
bootstrap.properties
:app.message=Hello Bootstrap
在这种情况下,如果激活了dev
配置文件,并且没有通过命令行参数进行覆盖,那么最终生效的属性值将是Hello Dev
。因为激活的特定配置文件具有比通用的配置文件和bootstrap.properties
更高的优先级。
需要注意的是,如果使用@Value
注解或Environment
对象获取属性值时,会优先使用命令行参数的值。如果命令行参数中没有定义该属性,才会使用配置文件中的属性值。
综上所述,多个配置文件共存时,根据加载顺序和优先级确定最终生效的属性值。命令行参数具有最高优先级,特定配置文件具有较高优先级,通用配置文件和bootstrap.properties
具有较低优先级。
五、多环境配置
多环境配置是使用不同的配置文件来适应不同的部署环境。以下是一些常见的多环境配置的示例:
-
开发环境(dev):
-
application-dev.yml
:包含开发环境的配置,如数据库连接信息、调试日志级别等。 -
application.yml
:通用配置文件,可能包含一些默认值或共享的配置。
-
-
测试环境(test):
-
application-test.yml
:包含测试环境的配置,如测试数据库连接信息、测试数据初始化脚本等。 -
application.yml
:通用配置文件。
-
-
生产环境(prod):
-
application-prod.yml
:包含生产环境的配置,如生产数据库连接信息、生产环境的缓存策略、日志输出路径等。 -
application.yml
:通用配置文件。
-
在这种配置下,通过设置 spring.profiles.active
属性来指定当前活动的配置环境。例如,在开发环境中,可以将 spring.profiles.active
设置为 dev
,然后应用程序将加载 application-dev.yml
和 application.yml
中的配置。类似地,可以通过设置 spring.profiles.active
为 test
或 prod
来加载相应环境的配置。
使用多环境配置,可以轻松切换和管理不同环境下的配置,确保应用程序在不同的部署环境中具有正确的配置和行为。
六、存在nacos配置时 文件加载顺序
- 当 Nacos 和本地都存在相同的配置时,优先加载 Nacos 上的配置。
-
user-dev.yaml (nacos) > user.yaml(nacos) > application.yml (本地)
七、 mvn设置不同的 Maven Profiles 来指定环境
使用 Maven 构建工具,您可以通过设置不同的 Maven Profiles 来指定环境。
以下是一种常见的方式来使用 Maven 设置环境:
- 在 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:dev
、test
和 prod
。dev
Profile 被设置为默认激活的 Profile。
- 在 Maven 构建命令中指定要激活的 Profile。通过在 Maven 命令中使用
-P
参数来激活特定的 Profile。例如:
mvn clean install -P test
上述命令将使用 test
Profile 进行构建。这会触发激活 test
Profile 中定义的配置和插件。
- 在项目的配置文件中使用
${env}
占位符引用环境变量。在您的项目配置文件(如application.yml
或application.properties
)中,您可以使用${env}
占位符引用激活的环境变量。例如:
spring:
profiles:
active: ${env}
通过上述配置,spring.profiles.active
属性的值将根据激活的 Maven Profile 动态设置。
通过这种方式,您可以使用 Maven 命令指定要激活的环境,然后在应用程序中加载相应的配置文件或采取其他适应特定环境的操作。这样,您可以在不同的环境中轻松切换和管理应用程序的配置和行为。