对于最新的稳定版本,请使用 Spring Boot 3.4.0spring-doc.cadn.net.cn

属性和配置

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

在构建时自动扩展属性

您可以使用现有的构建配置来自动扩展这些属性,而不是对项目的构建配置中指定的某些属性进行硬编码。 这在 Maven 和 Gradle 中都是可能的。spring-doc.cadn.net.cn

使用 Maven 自动扩展属性

您可以使用资源筛选自动扩展 Maven 项目中的属性。 如果您使用spring-boot-starter-parent,然后,您可以使用@..@placeholders,如以下示例所示:spring-doc.cadn.net.cn

app:
  encoding: "@project.build.sourceEncoding@"
  java:
    version: "@java.version@"
仅以这种方式过滤生产配置(换句话说,不应用过滤src/test/resources).
如果启用addResourcesflag 中,spring-boot:rungoal 可以添加src/main/resources直接发送到 Classpath (用于热重载目的)。 这样做会规避资源筛选和此功能。 相反,您可以使用exec:javagoal 或自定义插件的配置。 有关更多详细信息,请参阅插件使用页面

如果您不使用 starter parent,则需要在<build/>元素的pom.xml:spring-doc.cadn.net.cn

<resources>
	<resource>
		<directory>src/main/resources</directory>
		<filtering>true</filtering>
	</resource>
</resources>

您还需要在<plugins/>:spring-doc.cadn.net.cn

<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-resources-plugin</artifactId>
	<version>2.7</version>
	<configuration>
		<delimiters>
			<delimiter>@</delimiter>
		</delimiters>
		<useDefaultDelimiters>false</useDefaultDelimiters>
	</configuration>
</plugin>
useDefaultDelimiters如果您使用标准的 Spring 占位符(例如${placeholder}) 在您的配置中。 如果该属性未设置为false,这些可能会通过构建进行扩展。

使用 Gradle 自动扩展属性

您可以通过配置 Java 插件的processResourcestask 执行此作,如以下示例所示:spring-doc.cadn.net.cn

tasks.named('processResources') {
	expand(project.properties)
}

然后,您可以使用占位符引用 Gradle 项目的属性,如以下示例所示:spring-doc.cadn.net.cn

app.name=${name}
app.description=${description}
app:
  name: "${name}"
  description: "${description}"
Gradle 的expand方法使用 Groovy 的SimpleTemplateEngine,它将${..}令 牌。 这${..}style 与 Spring 自己的属性占位符机制冲突。 要将 Spring 属性占位符与自动扩展一起使用,请按如下方式转义 Spring 属性占位符:\${..}.

外部化 SpringApplication 的配置

一个SpringApplication具有 Bean 属性 setter,因此您可以在创建应用程序时使用其 Java API 来修改其行为。 或者,您可以通过在spring.main.*. 例如,在application.properties,您可能具有以下设置:spring-doc.cadn.net.cn

spring.main.web-application-type=none
spring.main.banner-mode=off
spring:
  main:
    web-application-type: "none"
    banner-mode: "off"

然后,Spring Boot 横幅不会在启动时打印,并且应用程序不会启动嵌入式 Web 服务器。spring-doc.cadn.net.cn

在外部配置中定义的属性将覆盖并替换使用 Java API 指定的值,但主源除外。 主要来源是提供给SpringApplication构造 函数:spring-doc.cadn.net.cn

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<String>) {
		val application = SpringApplication(MyApplication::class.java)
		application.setBannerMode(Banner.Mode.OFF)
		application.run(*args)
	}

}

或更改为sources(…​)方法SpringApplicationBuilder:spring-doc.cadn.net.cn

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<String>) {
		SpringApplicationBuilder()
			.bannerMode(Banner.Mode.OFF)
			.sources(MyApplication::class.java)
			.run(*args)
	}

}

鉴于上面的示例,如果我们有以下配置:spring-doc.cadn.net.cn

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. 应用程序源包括:spring-doc.cadn.net.cn

  1. MyApplication(来自代码)spring-doc.cadn.net.cn

  2. MyDatabaseConfig(来自外部配置)spring-doc.cadn.net.cn

  3. MyJmsConfig(来自外部配置)spring-doc.cadn.net.cn

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

默认情况下,来自不同源的属性会添加到 Spring 中Environment按定义的顺序(有关确切的顺序,请参见“ Spring Boot 功能”部分中的 Externalized Configuration)。spring-doc.cadn.net.cn

您还可以提供以下 System 属性(或环境变量)来更改行为:spring-doc.cadn.net.cn

  • spring.config.name (SPRING_CONFIG_NAME):默认为application作为文件名的根目录。spring-doc.cadn.net.cn

  • spring.config.location (SPRING_CONFIG_LOCATION):要加载的文件(例如类路径资源或 URL)。 单独的EnvironmentProperty Source 已为此文档设置,并且可以被 System Properties、Environment Variables 或 Command Line 覆盖。spring-doc.cadn.net.cn

无论你在环境中设置什么,Spring Boot 总是加载application.properties如上所述。 默认情况下,如果使用 YAML,则扩展名为 '.yaml' 和 '.yml 的文件也会添加到列表中。spring-doc.cadn.net.cn

如果需要有关正在加载的文件的详细信息,可以将日志记录级别设置为org.springframework.boot.context.configtrace.

使用 'short' 命令行参数

有些人喜欢使用 (例如)--port=9000而不是--server.port=9000在命令行中设置配置属性。 您可以通过在application.properties,如以下示例所示:spring-doc.cadn.net.cn

server.port=${port:8080}
server:
  port: "${port:8080}"
如果您继承自spring-boot-starter-parentPOM,则maven-resources-plugins已从 更改为 (即${*}@@maven.token@而不是${maven.token}) 以防止与 Spring 样式的占位符发生冲突。 如果您为application.properties直接,您可能还希望更改 Default Filter 令牌以使用其他分隔符
在此特定情况下,端口绑定在 PaaS 环境(如 Heroku 或 Cloud Foundry)中工作。 在这两个平台上,PORT环境变量会自动设置,并且 Spring 可以绑定到Environment性能。

将 YAML 用于外部属性

YAML 是 JSON 的超集,因此,它是以分层格式存储外部属性的便捷语法,如以下示例所示:spring-doc.cadn.net.cn

spring:
  application:
    name: "cruncher"
  datasource:
    driver-class-name: "com.mysql.jdbc.Driver"
    url: "jdbc:mysql://localhost/test"
server:
  port: 9000

创建一个名为application.yaml并将其放在 Classpath 的根目录中。 然后添加snakeyaml添加到您的依赖项(Maven 坐标org.yaml:snakeyaml,如果您使用spring-boot-starter). 将 YAML 文件解析为 JavaMap<String,Object>(就像一个 JSON 对象一样),并且 Spring Boot 会展平 Map,使其深度为一层,并且具有句点分隔的键,就像许多人习惯的那样Properties文件。spring-doc.cadn.net.cn

前面的示例 YAML 对应于以下内容application.properties文件:spring-doc.cadn.net.cn

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

有关 YAML 的更多信息,请参阅“'Spring Boot 功能'”部分中的使用 YAMLspring-doc.cadn.net.cn

设置激活的 Spring 配置文件

SpringEnvironment有一个 API,但您通常会将 System 属性 (spring.profiles.active) 或 OS 环境变量 (SPRING_PROFILES_ACTIVE). 此外,您还可以使用-D参数(记得放在主类或 jar 存档之前),如下所示:spring-doc.cadn.net.cn

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

在 Spring Boot 中,您还可以在application.properties,如以下示例所示:spring-doc.cadn.net.cn

spring.profiles.active=production
spring:
  profiles:
    active: "production"

以这种方式设置的值将替换为 System 属性或环境变量设置,而不是SpringApplicationBuilder.profiles()方法。 因此,后一个 Java API 可用于在不更改默认值的情况下扩充配置文件。spring-doc.cadn.net.cn

有关更多信息,请参见“ Spring Boot 功能”部分中的配置文件spring-doc.cadn.net.cn

设置默认配置文件名称

默认配置文件是在没有活动配置文件时启用的配置文件。 默认情况下,默认配置文件的名称为default,但可以使用 System 属性 (spring.profiles.default) 或 OS 环境变量 (SPRING_PROFILES_DEFAULT).spring-doc.cadn.net.cn

在 Spring Boot 中,您还可以在application.properties,如以下示例所示:spring-doc.cadn.net.cn

spring.profiles.default=dev
spring:
  profiles:
    default: "dev"

有关更多信息,请参见“ Spring Boot 功能”部分中的配置文件spring-doc.cadn.net.cn

根据环境更改配置

Spring Boot 支持多文档 YAML 和属性文件(有关详细信息,请参见使用多文档文件),这些文件可以根据活动配置文件有条件地激活。spring-doc.cadn.net.cn

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

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-doc.cadn.net.cn

文档将按遇到它们的顺序进行合并。 较晚的值将覆盖较早的值。

发现外部属性的内置选项

Spring Boot 将外部属性从application.properties(或 YAML 文件和其他地方)下载到应用程序中。 没有(从技术上讲也不可能)在一个位置包含所有受支持属性的详尽列表,因为贡献可能来自 Classpath 上的其他 jar 文件。spring-doc.cadn.net.cn

具有 Actuator 功能的正在运行的应用程序具有configprops端点,该端点显示所有可通过@ConfigurationProperties.spring-doc.cadn.net.cn

附录包括一个application.propertiesexample 中列出了 Spring Boot 支持的最常见属性。 最终列表来自搜索源代码@ConfigurationProperties@Value注释以及偶尔使用Binder. 有关加载属性的确切顺序的更多信息,请参阅 外部化配置spring-doc.cadn.net.cn