Spring Boot使您可以外部化配置,以便可以在不同环境中使用相同的应用程序代码。 您可以使用:
- 属性文件
- YAML文件
- 环境变量和命令行参数来外部化配置。
属性值可以通过直接注射到你的bean @Value注释,通过Spring的访问Environment对象,或者被绑定到结构化对象通过@ConfigurationProperties。
@Value可以引用Environment对象属性
eg: @Value("${name}")
环境变量和命令行参数:
这些SPRING_APPLICATION_JSON属性可以在命令行中提供环境变量。例如,您可以在UN * X shell中使用以下行:
$ SPRING_APPLICATION_JSON ='{“ acme”:{“ name”:“ test”}}}'java -jar myapp.jar
在前面的示例中,您最终acme.name=test在Spring中Environment。您还可以像spring.application.json在System属性中一样提供JSON ,如以下示例所示:
$ java -Dspring.application.json ='{“ name”:“ test”}'-jar myapp.jar
您还可以使用命令行参数来提供JSON,如以下示例所示:
$ java -jar myapp.jar --spring.application.json ='{“ name”:“ test”}'
您还可以将JSON作为JNDI变量提供,如下所示:java:comp/env/spring.application.json。
$ java -jar myapp.jar --server.port=9000
这种通过--开头的值,也会自动添加到Environment对象里面
如果您不想将命令行属性添加到中Environment,则可以使用禁用它们SpringApplication.setAddCommandLineProperties(false)。
配置随机值:
my.secret=${random.value} 随机字符串
my.number=${random.int} 随机int
my.bignumber=${random.long} 随机long
my.uuid=${random.uuid} 随机UUID
my.number.less.than.ten=${random.int(10)} 限定范围随机整数
my.number.in.range=${random.int[1024,65536]}限定范围随机整数
属性文件:
SpringApplication从application.properties以下位置的文件加载属性并将其添加到Spring中Environment:
1. 当前目录的/config子目录
2. 当前目录
3. classpath下的/config包
4. classpath根目录
该列表按优先级排序(在列表较高位置定义的属性会覆盖在较低位置定义的属性)。
如果您不喜欢application.properties配置文件名,则可以通过指定spring.config.name环境属性来切换到另一个文件名。您还可以使用spring.config.location环境属性(目录位置或文件路径的逗号分隔列表)来引用显式位置。下面的示例演示如何指定其他文件名:
$ java -jar myproject.jar --spring.config.name = myproject
下面的示例演示如何指定两个位置:
$ java -jar myproject.jar --spring.config.location = classpath:/default.properties,classpath:/override.properties
spring.config.name并且spring.config.location很早就用于确定必须加载哪些文件。必须将它们定义为环境属性(通常是OS环境变量,系统属性或命令行参数)。
如果spring.config.location包含目录(而不是文件),则应以目录结尾/(并且在运行时,在目录后附加从生成spring.config.name之前生成的名称,包括特定于配置文件的文件名)。指定的文件spring.config.location按原样使用,不支持特定于配置文件的变体,并且被任何特定于配置文件的属性覆盖。
配置位置以相反的顺序搜索。默认情况下,配置的位置是classpath:/,classpath:/config/,file:./,file:./config/。结果搜索顺序如下:
file:./config/
file:./
classpath:/config/
classpath:/
当使用来配置自定义配置位置时spring.config.location,它们将替换默认位置。例如,如果spring.config.location使用值配置classpath:/custom-config/,file:./custom-config/,则搜索顺序将变为以下内容:
file:./custom-config/
classpath:custom-config/
另外,当使用来配置自定义配置位置时spring.config.additional-location,除默认位置外,还会使用它们。在默认位置之前搜索其他位置。例如,如果classpath:/custom-config/,file:./custom-config/配置了的其他位置,则搜索顺序变为以下内容:
file:./custom-config/
classpath:custom-config/
file:./config/
file:./
classpath:/config/
classpath:/
通过此搜索顺序,您可以在一个配置文件中指定默认值,然后在另一个配置文件中有选择地覆盖这些值。您可以在以下默认位置之一中为您的应用程序提供默认值application.properties(或使用来选择的其他任何基本名称spring.config.name)。然后,可以在运行时使用自定义位置之一中的其他文件覆盖这些默认值。
特定配置文件:
除application.properties文件外,还可以使用以下命名约定来定义特定于配置文件的属性:application-{profile}.properties。在Environment具有一组默认的配置文件(默认[default])如果没有活动的简档设置中使用。换句话说,如果未显式激活任何概要文件,那么将从application-default.properties中加载属性。
特定于配置文件的属性是从与standard相同的位置加载的application.properties,特定于配置文件的文件始终会覆盖非特定文件,无论特定于配置文件的文件是在打包jar的内部还是外部。
如果指定了多个配置文件,则采用后赢策略。例如,由spring.profiles.active属性指定的配置文件会在通过SpringApplicationAPI 配置的配置文件之后添加,因此具有优先权。
如果您在中指定了任何文件spring.config.location,则不会考虑这些文件的特定于配置文件的变体。spring.config.location如果您还想使用特定于配置文件的属性,请使用目录。