又是美好的一天呀~
个人博客地址: huanghong.top
往下看看~
SpringBoot属性配置优先级
在Spring Boot中,应用程序可以使用多种方式来配置。以下是这些配置方式及其优先级的简要说明:
- 配置中心:如果应用程序使用了配置中心,那么配置中心中的配置文件将覆盖其他所有配置文件的值。这是最高优先级的配置方式。
- 命令行参数:可以在启动应用程序时使用命令行参数覆盖配置文件中的属性。这是第二高优先级的配置方式。
- 环境变量:可以使用环境变量来覆盖配置文件中的属性。这是第三高优先级的配置方式。
- Jar包同级目录下的配置文件:在启动应用程序时,如果在应用程序的jar包的同级目录下存在配置文件,那么这些配置文件将覆盖src/main/resources目录下的同名文件的值。这是第四高优先级的配置方式。
- Spring Boot提供的属性源:Spring Boot提供了多个属性源,如系统属性,JNDI属性等。这是第五高优先级的配置方式。
- @PropertySource注释:可以使用@PropertySource注释指定属性文件的位置。这是第六高优先级的配置方式。
- bootstrap.properties/bootstrap.yml:这是Spring Boot提供的特殊的配置文件,用于在application.properties/application.yml加载之前设置一些配置属性。这是第七高优先级的配置方式。
- application.properties/application.yml:这是应用程序的默认配置文件,如果没有其他配置文件覆盖它,则使用这些文件中的配置值。这是最低优先级的配置方式。
PropertySource的优先级
PropertySource的优先级按照以下顺序从高到低:
- 系统属性 (System properties)
- 环境变量 (Environment variables)
- 命令行参数 (Command line arguments)
- JNDI 属性 (JNDI attributes)
- Java EE 中的 ServletContext 参数 (ServletContext parameters)
- ServletConfig 中的初始化参数 (ServletConfig init parameters)
- @PropertySource 注解中指定的属性文件 (Properties defined in @PropertySource annotation)
- SpringApplication.setDefaultProperties 中指定的默认属性 (Default properties defined in SpringApplication.setDefaultProperties)
- Spring Framework 中的 @ConfigurationProperties 注解 (Properties defined in @ConfigurationProperties annotation)
属性覆盖规则
属性覆盖规则按照以下顺序从高到低:
- 配置中心的属性将覆盖所有其他属性。
- 命令行参数将覆盖配置文件中的属性。
- 环境变量将覆盖配置文件中的属性。
- jar包同级目录下的配置文件将覆盖src/main/resources目录下的同名文件的值。
- bootstrap.properties/bootstrap.yml文件将覆盖application.properties/application.yml文件中的值。
- 优先级较高的@PropertySource注释中指定的属性文件将覆盖优先级较低的@PropertySource注释中指定的属性文件中的值。
- 高优先级的属性源将覆盖低优先级的属性源中的值。
示例
以下是一个示例,展示了这些属性配置方式的优先级:
假设我们有一个名为"myapp"的应用程序,并且有以下配置文件:
application.properties
myapp.message=Hello from application.properties
bootstrap.properties
myapp.message=Hello from bootstrap.properties
myapp.properties
myapp.message=Hello from myapp.properties
在启动应用程序时,我们使用以下命令行参数:
java -jar myapp.jar --myapp.message="Hello from command line arguments"
在这种情况下,"Hello from command line arguments"将是应用程序的属性值,因为命令行参数是最高优先级的配置方式。如果我们没有使用命令行参数,则使用以下优先级来确定属性值:
- 配置中心(如果应用程序使用了配置中心)。
- 系统属性、环境变量和命令行参数。
- jar包同级目录下的myapp.properties文件。
- bootstrap.properties文件中的myapp.message属性值。
- application.properties文件中的myapp.message属性值。
因此,在没有使用命令行参数的情况下,应用程序的属性值将是"Hello from myapp.properties",因为myapp.properties是最高优先级的属性源。如果我们删除myapp.properties文件,则属性值将变为"Hello from bootstrap.properties",因为bootstrap.properties是次高优先级的属性源。
感谢阅读完本篇文章!!!
个人博客地址: huanghong.top