本节包括有关设置和读取属性和配置设置以及它们与Spring Boot应用程序的交互的主题。

2.1. 在构建时自动扩展属性

除了可以对项目的构建配置中也指定的某些属性进行硬编码之外,您可以通过使用现有构建配置自动扩展它们。在Maven和Gradle中都是可能的。

2.1.1. 使用Maven自动扩展属性

您可以使用资源过滤从Maven项目自动扩展属性。如果使用spring-boot-starter-parent,则可以使用@..@占位符引用Maven的“项目属性” ,如以下示例所示:
物产
Yaml

  1. app.encoding=@project.build.sourceEncoding@
  2. app.java.version=@java.version@
这样只会过滤生产配置(也就是说,不会对进行过滤src/test/resources)。
如果启用该addResources标志,则spring-boot:run目标可以src/main/resources直接添加到类路径中(用于热重载)。这样做避免了资源过滤和此功能。相反,您可以使用exec:java目标或自定义插件的配置。有关更多详细信息,请参见插件使用情况页面

如果您不使用入门级父级,则需要在<build/>元素中包括以下元素pom.xml

  1. <resources>
  2. <resource>
  3. <directory>src/main/resources</directory>
  4. <filtering>true</filtering>
  5. </resource>
  6. </resources>

您还需要在其中包含以下元素<plugins/>

  1. <plugin>
  2. <groupId>org.apache.maven.plugins</groupId>
  3. <artifactId>maven-resources-plugin</artifactId>
  4. <version>2.7</version>
  5. <configuration>
  6. <delimiters>
  7. <delimiter>@</delimiter>
  8. </delimiters>
  9. <useDefaultDelimiters>false</useDefaultDelimiters>
  10. </configuration>
  11. </plugin>
useDefaultDelimiters如果${placeholder}在配置中使用标准的Spring占位符(例如),则 该属性很重要。如果该属性未设置为false,则可以通过构建扩展这些属性。

2.1.2. 使用Gradle自动扩展属性

您可以通过配置Java插件的processResources任务来自动扩展Gradle项目中的属性,如以下示例所示:

  1. processResources {
  2. expand(project.properties)
  3. }

然后,您可以使用占位符来引用Gradle项目的属性,如以下示例所示:
物产
Yaml

  1. app.name=${name}
  2. app.description=${description}
Gradle的expand方法使用Groovy的方法SimpleTemplateEngine来转换${..}令牌。该${..}风格的冲突与Spring自己的财产占位符机制。要将Spring属性占位符与自动扩展一起使用,请按以下步骤对Spring属性占位符进行转义:\${..}

2.2. 外部化SpringApplication的配置

ASpringApplication具有bean属性(主要是setter),因此在创建应用程序时可以使用其Java API修改其行为。或者,您可以通过在中设置属性来外部化配置spring.main.*。例如,在中application.properties,您可能具有以下设置:
物产
Yaml

  1. spring.main.web-application-type=none
  2. spring.main.banner-mode=off

然后,Spring Boot标语不会在启动时打印,并且应用程序也不会启动嵌入式Web服务器。
外部配置中定义的属性会覆盖用Java API指定的值,但用于创建的源的显着例外除外ApplicationContext。考虑以下应用程序:

  1. new SpringApplicationBuilder()
  2. .bannerMode(Banner.Mode.OFF)
  3. .sources(demo.MyApp.class)
  4. .run(args);

现在考虑以下配置:
物产
Yaml

  1. spring.main.sources=com.acme.Config,com.acme.ExtraConfig
  2. spring.main.banner-mode=console

实际应用中,现在示出的旗帜(如通过配置覆盖),并使用了三个源ApplicationContext(按以下顺序): ,demo.MyAppcom.acme.Configcom.acme.ExtraConfig

2.3. 更改应用程序外部属性的位置

默认情况下,来自不同来源的属性Environment将以定义的顺序添加到Spring中(有关确切顺序,请参见“ Spring Boot功能”部分中的“ spring-boot-features.html ”)。
您还可以提供以下系统属性(或环境变量)来更改行为:

  • spring.config.nameSPRING_CONFIG_NAME):默认为application作为文件名的根。
  • spring.config.locationSPRING_CONFIG_LOCATION):要加载的文件(例如类路径资源或URL)。Environment为此文档设置了单独的属性源,可以通过系统属性,环境变量或命令行来覆盖它。

无论您在环境中进行什么设置,Spring Boot都将始终application.properties如上所述进行加载。默认情况下,如果使用YAML,则扩展名为’.yml’的文件也将添加到列表中。
Spring Boot记录了在该DEBUG级别加载的配置文件以及在该级别找不到的候选文件TRACE
请参阅ConfigFileApplicationListener以获取更多详细信息。

2.4. 使用“简短”命令行参数

有些人喜欢使用(例如)--port=9000而不是--server.port=9000在命令行上设置配置属性。您可以通过在中使用占位符来启用此行为application.properties,如以下示例所示:
物产
Yaml

  1. server.port=${port:8080}
如果您从spring-boot-starter-parentPOM继承,则将的默认过滤器令牌maven-resources-plugins从更改${*}@(即,@maven.token@而不是${maven.token}),以防止与Spring样式的占位符冲突。如果您application.properties直接启用了Maven过滤,则可能还需要更改默认过滤器令牌以使用其他定界符
在这种特定情况下,端口绑定可在PaaS环境(例如Heroku或Cloud Foundry)中工作。在这两个平台中,PORT环境变量是自动设置的,并且Spring可以绑定到Environment属性的大写同义词。

2.5. 对外部属性使用YAML

YAML是JSON的超集,因此是一种方便的语法,用于以分层格式存储外部属性,如以下示例所示:

  1. spring:
  2. application:
  3. name: "cruncher"
  4. datasource:
  5. driver-class-name: "com.mysql.jdbc.Driver"
  6. url: "jdbc:mysql://localhost/test"
  7. server:
  8. port: 9000

创建一个名为的文件application.yml,并将其放在类路径的根目录中。然后添加snakeyaml到您的依赖项(Maven坐标org.yaml:snakeyaml,如果使用,则已经包含在内spring-boot-starter)。将YAML文件解析为Java Map<String,Object>(如JSON对象),然后Spring Boot展宽地图,使其深一层,并具有句点分隔的键,这是许多人习惯使用PropertiesJava中的文件的原因。
前面的示例YAML对应于以下application.properties文件:

  1. spring.application.name=cruncher
  2. spring.datasource.driver-class-name=com.mysql.jdbc.Driver
  3. spring.datasource.url=jdbc:mysql://localhost/test
  4. server.port=9000

有关YAML的更多信息,请参见“ Spring Boot功能”部分中的“ spring-boot-features.html ”。

2.6. 设置活动弹簧轮廓

SpringEnvironment为此提供了一个API,但是您通常会设置一个System属性(spring.profiles.active)或OS环境变量(SPRING_PROFILES_ACTIVE)。另外,您可以使用-D参数启动应用程序(请记住将其放在主类或jar存档之前),如下所示:
$ java -jar -Dspring.profiles.active =生产演示-0.0.1-SNAPSHOT.jar
在Spring Boot中,您还可以在中设置活动配置文件application.properties,如以下示例所示:
物产
Yaml

  1. spring.profiles.active=production

以这种方式设置的值将由“系统”属性或环境变量设置代替,而不由SpringApplicationBuilder.profiles()方法替代。因此,后一种Java API可用于扩充配置文件,而无需更改默认值。
有关更多信息,请参见“ Spring Boot功能”部分中的“ spring-boot-features.html ”。

2.7. 根据环境更改配置

Spring Boot支持多文档的YAML和属性文件(有关详细信息,请参见spring-boot-features.html),可以根据活动的配置文件有条件地对其进行激活。
如果文档包含spring.config.activate.on-profile键,则将配置文件值(以逗号分隔的配置文件列表或配置文件表达式)馈入SpringEnvironment.acceptsProfiles()方法。如果配置文件表达式匹配,则该文档将包含在最终合并中(否则,则不包括),如以下示例所示:
物产
Yaml

  1. server.port=9000
  2. #---
  3. spring.config.activate.on-profile=development
  4. server.port=9001
  5. #---
  6. spring.config.activate.on-profile=production
  7. server.port=0

在前面的示例中,默认端口为9000。但是,如果名为“ development”的Spring概要文件处于活动状态,则该端口为9001。如果“ production”为活动,则该端口为0。

这些文档按照它们遇到的顺序合并。以后的值将覆盖以前的值。

2.8. 发现外部属性的内置选项

Spring Boot在运行时将来自application.properties(或.yml文件和其他位置)的外部属性绑定到应用程序中。在一个位置上没有(而且从技术上来说不是)所有受支持属性的详尽列表,因为贡献可能来自类路径上的其他jar文件。
具有Actuator功能的正在运行的应用程序具有一个configprops终结点,该终结点显示可通过访问的所有绑定和可绑定属性@ConfigurationProperties
附录中包含一个application.properties示例,其中列出了Spring Boot支持的最常见属性。最终列表来自搜索源代码中的@ConfigurationProperties@Value注释,以及偶尔使用Binder。有关加载属性的确切顺序的更多信息,请参见“ spring-boot-features.html ”。