Spring Boot

操作指南

属性和配置

属性和配置

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

在构建时自动展开属性

您可以使用现有的构建配置来自动展开属性,而不是对一些也指定在项目构建配置中的属性进行硬编码。这在 Maven 和 Gradle 中都可能实现。

使用 Maven 自动展开属性

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

属性

YAML

[email protected]@

[email protected]@

app:

encoding: "@project.build.sourceEncoding@"

java:

version: "@java.version@"

只有生产配置会以这种方式进行过滤(换句话说,不对 src/test/resources 应用过滤)。

如果您启用 addResources 标志,spring-boot:run 目标可以将 src/main/resources 直接添加到类路径(用于热重载)。这样做会规避资源过滤和此功能。您可以改用 exec:java 目标或自定义插件的配置。有关更多详细信息,请参阅插件使用页面。

如果您不使用 starter parent,则需要在 pom.xml 的 元素内包含以下元素:

src/main/resources

true

您还需要在 中包含以下元素:

org.apache.maven.plugins

maven-resources-plugin

2.7

@

false

如果您在配置中使用标准 Spring 占位符(例如 ${placeholder}),则 useDefaultDelimiters 属性很重要。如果未将该属性设置为 false,则这些占位符可能会在构建时展开。

使用 Gradle 自动展开属性

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

tasks.named('processResources') {

expand(project.properties)

}

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

属性

YAML

app.name=${name}

app.description=${description}

app:

name: "${name}"

description: "${description}"

Gradle 的 expand 方法使用 Groovy 的 SimpleTemplateEngine,它转换 ${..} 标记。${..} 样式与 Spring 自己的属性占位符机制冲突。要将 Spring 属性占位符与自动展开一起使用,请按以下方式转义 Spring 属性占位符:\${..}。

外部化 SpringApplication 的配置

一个 SpringApplication 具有 bean 属性设置器,因此您可以在创建应用程序时使用其 Java API 来修改其行为。或者,您可以通过在 spring.main.* 中设置属性来外部化配置。例如,在 application.properties 中,您可能具有以下设置:

属性

YAML

spring.main.web-application-type=none

spring.main.banner-mode=off

spring:

main:

web-application-type: "none"

banner-mode: "off"

然后,Spring Boot 启动时不会打印横幅,并且应用程序不会启动嵌入式 Web 服务器。

外部配置中定义的属性会覆盖并替换通过 Java API 指定的值,但主源除外。主源是提供给 SpringApplication 构造函数的那些源:

Java

Kotlin

import org.springframework.boot.Banner;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication

public class MyApplication {

public static void main(String[] args) {

SpringApplication application = new SpringApplication(MyApplication.class);

application.setBannerMode(Banner.Mode.OFF);

application.run(args);

}

}

import org.springframework.boot.Banner

import org.springframework.boot.SpringApplication

import org.springframework.boot.autoconfigure.SpringBootApplication

@SpringBootApplication

object MyApplication {

@JvmStatic

fun main(args: Array) {

val application = SpringApplication(MyApplication::class.java)

application.setBannerMode(Banner.Mode.OFF)

application.run(*args)

}

}

或提供给 SpringApplicationBuilder 的 sources(…​) 方法:

Java

Kotlin

import org.springframework.boot.Banner;

import org.springframework.boot.builder.SpringApplicationBuilder;

public class MyApplication {

public static void main(String[] args) {

new SpringApplicationBuilder()

.bannerMode(Banner.Mode.OFF)

.sources(MyApplication.class)

.run(args);

}

}

import org.springframework.boot.Banner

import org.springframework.boot.builder.SpringApplicationBuilder

object MyApplication {

@JvmStatic

fun main(args: Array) {

SpringApplicationBuilder()

.bannerMode(Banner.Mode.OFF)

.sources(MyApplication::class.java)

.run(*args)

}

}

鉴于以上示例,如果我们有以下配置:

属性

YAML

spring.main.sources=com.example.MyDatabaseConfig,com.example.MyJmsConfig

spring.main.banner-mode=console

spring:

main:

sources: "com.example.MyDatabaseConfig,com.example.MyJmsConfig"

banner-mode: "console"

实际应用程序将显示横幅(被配置覆盖)并使用三个源作为 ApplicationContext。应用程序源是:

MyApplication (来自代码)

MyDatabaseConfig (来自外部配置)

MyJmsConfig(来自外部配置)

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

默认情况下,来自不同源的属性以定义的顺序添加到 Spring Environment 中(有关确切顺序,请参阅“Spring Boot 功能”部分中的外部化配置)。

您还可以提供以下系统属性(或环境变量)来改变行为:

spring.config.name (SPRING_CONFIG_NAME):默认为 application 作为文件名的根。

spring.config.location (SPRING_CONFIG_LOCATION):要加载的文件(例如类路径资源或 URL)。为本文档设置了一个单独的 Environment 属性源,并且它可以通过系统属性、环境变量或命令行进行覆盖。

无论您在环境中设置了什么,Spring Boot 始终按上述方式加载 application.properties。默认情况下,如果使用 YAML,则带有“.yaml”和“.yml”扩展名的文件也会添加到列表中。

如果您想了解有关正在加载的文件的详细信息,可以将 org.springframework.boot.context.config 的日志级别设置为 trace。

使用“简短”命令行参数

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

属性

YAML

server.port=${port:8080}

server:

port: "${port:8080}"

如果您继承自 spring-boot-starter-parent POM,则 maven-resources-plugins 的默认过滤器令牌已从 ${*} 更改为 @ (即 @maven.token@ 而不是 ${maven.token}),以防止与 Spring 风格的占位符发生冲突。如果您直接为 application.properties 启用了 Maven 过滤,您可能还希望将默认过滤器令牌更改为使用其他分隔符。

在这种特定情况下,端口绑定在 PaaS 环境(如 Heroku 或 Cloud Foundry)中有效。在这两个平台上,PORT 环境变量会自动设置,Spring 可以绑定到 Environment 属性的大写同义词。

将 YAML 用于外部属性

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

spring:

application:

name: "cruncher"

datasource:

driver-class-name: "com.mysql.jdbc.Driver"

url: "jdbc:mysql:///test"

server:

port: 9000

创建一个名为 application.yaml 的文件并将其放在类路径的根目录中。然后将 snakeyaml 添加到您的依赖项中(Maven 坐标 org.yaml:snakeyaml,如果您使用 spring-boot-starter,则已包含)。YAML 文件被解析为 Java Map(像 JSON 对象),Spring Boot 会展平该映射,使其只有一层深并具有句点分隔的键,就像许多人习惯于使用 Java 中的 Properties 文件一样。

前面的 YAML 示例对应于以下 application.properties 文件:

spring.application.name=cruncher

spring.datasource.driver-class-name=com.mysql.jdbc.Driver

spring.datasource.url=jdbc:mysql:///test

server.port=9000

有关 YAML 的更多信息,请参阅“Spring Boot 功能”部分中的使用 YAML。

设置活动 Spring 配置文件

Spring Environment 有一个用于此的 API,但您通常会设置一个系统属性 (spring.profiles.active) 或一个 OS 环境变量 (SPRING_PROFILES_ACTIVE)。此外,您可以使用 -D 参数启动应用程序(记住将其放在主类或 jar 档案之前),如下所示:

$ java -jar -Dspring.profiles.active=production demo-0.0.1-SNAPSHOT.jar

在 Spring Boot 中,您还可以在 application.properties 中设置活动配置文件,如以下示例所示:

属性

YAML

spring.profiles.active=production

spring:

profiles:

active: "production"

以这种方式设置的值会被系统属性或环境变量设置替换,但不会被 SpringApplicationBuilder.profiles() 方法替换。因此,后者的 Java API 可用于在不更改默认值的情况下增强配置文件。

有关更多信息,请参阅“Spring Boot 功能”部分中的配置文件。

设置默认配置文件名

默认配置文件是在没有配置文件激活时启用的配置文件。默认情况下,默认配置文件的名称是 default,但可以使用系统属性 (spring.profiles.default) 或 OS 环境变量 (SPRING_PROFILES_DEFAULT) 进行更改。

在 Spring Boot 中,您还可以在 application.properties 中设置默认配置文件名,如以下示例所示:

属性

YAML

spring.profiles.default=dev

spring:

profiles:

default: "dev"

有关更多信息,请参阅“Spring Boot 功能”部分中的配置文件。

根据环境更改配置

Spring Boot 支持多文档 YAML 和 Properties 文件(有关详细信息,请参阅使用多文档文件),它们可以根据活动配置文件有条件地激活。

如果文档包含 spring.config.activate.on-profile 键,则 profiles 值(逗号分隔的配置文件列表或配置文件表达式)将馈送到 Spring Environment.acceptsProfiles() 方法中。如果配置文件表达式匹配,则该文档将包含在最终合并中(否则不包含),如以下示例所示:

属性

YAML

server.port=9000

#---

spring.config.activate.on-profile=development

server.port=9001

#---

spring.config.activate.on-profile=production

server.port=0

server:

port: 9000

---

spring:

config:

activate:

on-profile: "development"

server:

port: 9001

---

spring:

config:

activate:

on-profile: "production"

server:

port: 0

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

文档按其遇到的顺序合并。后来的值会覆盖较早的值。

发现外部属性的内置选项

Spring Boot 在运行时将 application.properties(或 YAML 文件和其他位置)中的外部属性绑定到应用程序中。在单个位置没有(技术上也不能有)所有支持的属性的详尽列表,因为贡献可能来自类路径上的其他 jar 文件。

具有 Actuator 功能的运行中的应用程序有一个 configprops 端点,该端点显示通过 @ConfigurationProperties 可用的所有绑定和可绑定属性。

附录包含一个 application.properties 示例,其中列出了 Spring Boot 支持的最常见属性。确切的列表来自搜索 @ConfigurationProperties 和 @Value 注解以及偶尔使用 Binder 的源代码。有关加载属性的确切顺序的更多信息,请参阅外部化配置。

Spring Boot 应用程序 嵌入式 Web 服务器