SpringBoot配置文件加载顺序
Posted 天宇轩-王
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot配置文件加载顺序相关的知识,希望对你有一定的参考价值。
Spring Boot 允许您外部化 configuration,以便您可以在不同的环境中使用相同的 application code。您可以使用 properties files,YAML files,环境变量和 command-line arguments 来外部化 configuration。 Property 值可以通过使用@Value
annotation 直接注入 beans,通过 Spring 的Environment
抽象访问,或者绑定到结构化的 objects到@ConfigurationProperties
。
Spring Boot 使用一个非常特殊的PropertySource
order 来设计允许合理地覆盖值。 Properties 在以下 order 中被考虑:
-
您的主目录上的Devtools global 设置 properties(当 devtools 为 active 时为
~/.spring-boot-devtools.properties
)。 -
@TestPropertySource 注释测试。
-
你测试的
properties
属性。可在@SpringBootTest和test annotations 用于测试 application 的特定切片上使用。 -
命令 line arguments。
-
_Pro来自
SPRING_APPLICATION_JSON
(嵌入在环境变量或系统 property 中的内联 JSON)。 -
ServletConfig
init 参数。 -
ServletContext
init 参数。 -
来自
java:comp/env
的 JNDI 属性。 -
Java System properties(
System.getProperties()
)。 -
OS 环境变量。
-
只在
random.*
中具有 properties。 -
jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件
-
jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件
-
jar包外部的application.properties或application.yml(不带spring.profile)配置文件
-
jar包内部的application.properties或application.yml(不带spring.profile)配置文件
-
@Configuration
classes 上的@PropertySource 注释。 -
默认 properties(通过设置
SpringApplication.setDefaultProperties
指定)。
要提供具体的 example,假设您开发了一个使用name
property 的@Component
,如下面的示例所示:
import org.springframework.stereotype.*; import org.springframework.beans.factory.annotation.*; ? @Component public class MyBean { ? @Value("${name}") private String name; ? // ... ? }
在 application classpath(对于 example,在 jar 中),您可以拥有一个application.properties
文件,为name
提供合理的默认 property value。在新环境中运行时,可以在 jar 之外提供覆盖name
的application.properties
文件。对于 one-off 测试,您可以使用特定命令 line 开关启动(对于 example,java -jar app.jar --name="Spring"
)。
可以在命令 line 上使用环境变量提供
SPRING_APPLICATION_JSON
properties。对于 example,您可以在 UN * X shell 中使用以下 line:
$ SPRING_APPLICATION_JSON=‘{"acme":{"name":"test"}}‘ java -jar myapp.jar
在前面的 example 中,最终在 Spring Environment
中得到了acme.name=test
。您还可以在 System property 中将 JSON 提供为spring.application.json
,如以下 example 所示:
$ java -Dspring.application.json=‘{"name":"test"}‘ -jar myapp.jar
您还可以使用命令 line 参数提供 JSON,如以下 example 所示:
$ java -jar myapp.jar --spring.application.json=‘{"name":"test"}‘
您还可以将 JSON 作为 JNDI 变量提供,如下所示:java:comp/env/spring.application.json
。
配置随机值
RandomValuePropertySource
对于注入随机值非常有用(例如,对于秘密或测试用例)。它可以生成整数,长整数,uuids 或 strings,如下面的示例所示:
my.secret=${random.value} my.number=${random.int} my.bignumber=${random.long} my.uuid=${random.uuid} my.number.less.than.ten=${random.int(10)} my.number.in.range=${random.int[1024,65536]}
random.int*
语法是OPEN value (,max) CLOSE
,其中OPEN,CLOSE
是任何字符,value,max
是整数。如果提供max
,则value
是最小值,max
是最大 value(不包括)。
访问命令 Line Properties
默认情况下,SpringApplication
将任何命令 line 选项 arguments(即如前所述,命令 line properties 始终优先于其他 property 源。
如果您不希望将 line properties 命令添加到Environment
,则可以使用SpringApplication.setAddCommandLineProperties(false)
禁用它们。
Application Property Files
SpringApplication
在以下位置从application.properties
files 加载 properties 并将它们添加到 Spring Environment
:
-
当前目录的
/config
子目录 (在src上面一层) -
当前目录 (在src上面一层)
-
一个 classpath
/config
包 -
classpath 根目录
该列表按优先级排序(在列表中较高位置定义的 properties 将覆盖在较低位置中定义的位置)。
你也可以使用 YAML(‘.yml‘)files作为‘.properties‘的替代品。
如果您不喜欢application.properties
作为 configuration 文件 name,则可以通过指定spring.config.name
environment property 切换到另一个文件 name。您还可以使用spring.config.location
environment property(这是目录位置的 comma-separated 列表或文件_path)来引用显式位置。以下 example 显示了如何指定不同的文件 name:
$ java -jar myproject.jar --spring.config.name=myproject
以下 example 显示了如何指定两个位置:
$ java -jar myproject.jar --spring.config.location=classpath:/default.properties,classpath:/override.properties
很早就会使用
spring.config.name
和spring.config.location
来确定必须加载哪些 files,因此必须将它们定义为环境 property(通常是 OS 环境变量,系统 property 或 command-line 参数)。
如果spring.config.location
包含目录(而不是 files),它们应该以/
结尾(并且在运行时,在加载之前附加从spring.config.name
生成的名称,包括 profile-specific 文件名)。 spring.config.location
中指定的 Files 使用 as-is,不支持 profile-specific 变体,并被任何 profile-specific properties 覆盖。
在反向 order 中搜索配置位置。默认情况下,配置的位置为classpath:/,classpath:/config/,file:./,file:./config/
。生成的 search order 如下:
-
file:./config/
-
file:./
-
classpath:/config/
-
classpath:/
使用spring.config.location
配置自定义配置位置时,它们会替换默认位置。对于 example,如果使用 value classpath:/custom-config/,file:./custom-config/
配置了spring.config.location
,则 search order 将变为以下内容:
-
file:./custom-config/
-
classpath:custom-config/
或者,当使用spring.config.additional-location
配置自定义配置位置时,除默认位置外,还会使用它们。在默认位置之前搜索其他位置。例如,如果配置了classpath:/custom-config/,file:./custom-config/
的其他位置,则 search order 将变为以下内容:
-
file:./custom-config/
-
classpath:custom-config/
-
file:./config/
-
file:./
-
classpath:/config/
-
classpath:/
此搜索 ordering 允许您在一个 configuration 文件中指定默认值,然后有选择地在另一个 configuration 文件中覆盖这些值。您可以在其中一个默认位置为application.properties
(或您使用spring.config.name
选择的任何其他基本名称)中的 application 提供默认值。然后,可以在运行时使用位于其中一个自定义位置的不同文件覆盖这些默认值。
如果使用环境变量而不是 system properties,则大多数操作系统都不允许使用 period-separated key 名称,但您可以使用下划线(对于 example,
SPRING_CONFIG_NAME
而不是spring.config.name
)。
如果 application 在容器中运行,则可以使用 JNDI properties(在
java:comp/env
中)或 servlet context 初始化参数来代替环境变量或系统 properties。
除了application.properties
files 之外,还可以使用以下命名约定来定义 profile-specific properties:application-{profile}.properties
。如果没有设置 active profiles,则Environment
有一组默认的 profiles(默认为[default]
)。换句话说,如果没有显式激活 profiles,则会加载application-default.properties
中的 properties。
Profile-specific properties 从与标准application.properties
相同的位置加载,profile-specific files 始终覆盖 non-specific files,无论 profile-specific files 是否在打包的 jar 内部或外部。
如果指定了多个 profiles,则应用 last-wins 策略。对于 example,spring.profiles.active
property 指定的 profiles 将添加到通过SpringApplication
API 配置的 profile 之后,因此优先。
如果您在
spring.config.location
中指定了任何 files,则不会考虑这些 files 的 profile-specific 变体。如果您还想使用 profile-specific properties,请使用spring.config.location
中的目录。
Properties 中的占位符
application.properties
中的值在使用时通过现有的Environment
进行过滤,因此您可以返回先前定义的值(对于 example,来自 System properties)。
app.name=MyApp
app.description=${app.name} is a Spring Boot application
以上是关于SpringBoot配置文件加载顺序的主要内容,如果未能解决你的问题,请参考以下文章