对于最新的稳定版本,请使用 Spring Boot 3.5.5! |
属性和配置
本节包括有关设置和读取属性和配置设置及其与 Spring Boot 应用程序交互的主题。
在构建时自动展开属性
无需对项目的生成配置中也指定的某些属性进行硬编码,而是可以使用现有生成配置来自动扩展它们。 这在 Maven 和 Gradle 中都是可能的。
使用 Maven 自动属性扩展
您可以使用资源筛选自动扩展 Maven 项目中的属性。
如果您使用spring-boot-starter-parent
,然后你可以使用@..@
占位符,如以下示例所示:
-
Properties
-
YAML
app:
encoding: "@project.build.sourceEncoding@"
java:
version: "@java.version@"
只有生产配置以这种方式过滤(换句话说,不应用过滤src/test/resources ). |
如果您启用addResources flag,则spring-boot:run 目标可以添加src/main/resources 直接到类路径(用于热重载目的)。
这样做可以规避资源筛选和此功能。
相反,您可以使用exec:java 目标或自定义插件的配置。
有关更多详细信息,请参阅插件使用页面。 |
如果您不使用起始父级,则需要在<build/>
元素的pom.xml
:
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
您还需要在<plugins/>
:
<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 插件的processResources
任务,如以下示例所示:
tasks.named('processResources') {
expand(project.properties)
}
然后,您可以使用占位符引用 Gradle 项目的属性,如以下示例所示:
-
Properties
-
YAML
app.name=${name}
app.description=${description}
app:
name: "${name}"
description: "${description}"
Gradle 的expand 方法使用 Groovy 的SimpleTemplateEngine ,这会变换${..} Tokens。
这${..} style 与 Spring 自己的属性占位符机制冲突。
要将 Spring 属性占位符与自动扩展一起使用,请转义 Spring 属性占位符,如下所示:\${..} . |
外部化 SpringApplication 的配置
一个SpringApplication
具有 bean 属性设置器,因此您可以在创建应用程序时使用其 Java API 来修改其行为。
或者,您可以通过在spring.main.*
.
例如,在application.properties
,您可能有以下设置:
-
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<String>) {
val application = SpringApplication(MyApplication::class.java)
application.setBannerMode(Banner.Mode.OFF)
application.run(*args)
}
}
或者sources(…)
方法SpringApplicationBuilder
:
-
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<String>) {
SpringApplicationBuilder()
.bannerMode(Banner.Mode.OFF)
.sources(MyApplication::class.java)
.run(*args)
}
}
给定上面的示例,如果我们有以下配置:
-
Properties
-
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
(来自外部配置)
更改应用程序外部属性的位置
默认情况下,来自不同来源的属性将添加到 SpringEnvironment
按照定义的顺序(有关确切顺序,请参阅“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
,如以下示例所示:
-
Properties
-
YAML
server.port=${port:8080}
server:
port: "${port:8080}"
如果您继承自spring-boot-starter-parent POM,默认的过滤器Tokensmaven-resources-plugins 已从 更改为 (即,${*} @ @maven.token@ 而不是${maven.token} )以防止与 Spring 样式占位符发生冲突。
如果您已为application.properties 直接,您可能还想更改默认过滤器Tokens以使用其他分隔符。 |
在这种特定情况下,端口绑定在 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://localhost/test"
server:
port: 9000
创建一个名为application.yaml
并将其放在类路径的根目录中。然后添加snakeyaml
到你的依赖项(Maven 坐标org.yaml:snakeyaml
,如果您使用spring-boot-starter
). YAML 文件被解析为 JavaMap<String,Object>
(如 JSON 对象),并且 Spring Boot 将映射展平,使其具有一级深度并具有句点分隔的键,就像许多人习惯的那样Properties
Java 中的文件。
前面的示例 YAML 对应于以下内容application.properties
文件:
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 功能”部分中的使用 YAML。
设置活动 Spring 配置文件
SpringEnvironment
有一个 API,但您通常会设置一个 System 属性 (spring.profiles.active
) 或作系统环境变量 (SPRING_PROFILES_ACTIVE
).
此外,您可以使用-D
参数(记得放在主类或jar存档之前),如下所示:
$ java -jar -Dspring.profiles.active=production demo-0.0.1-SNAPSHOT.jar
在 Spring Boot 中,您还可以在application.properties
,如以下示例所示:
-
Properties
-
YAML
spring.profiles.active=production
spring:
profiles:
active: "production"
以这种方式设置的值将被 System 属性或环境变量设置替换,但不会被SpringApplicationBuilder.profiles()
方法。
因此,后一个 Java API 可用于在不更改默认值的情况下扩充配置文件。
有关更多信息,请参阅“Spring Boot 功能”部分中的配置文件。
设置默认配置文件名称
默认配置文件是在没有活动配置文件时启用的配置文件。
默认情况下,默认配置文件的名称为default
,但可以使用 System 属性 (spring.profiles.default
) 或作系统环境变量 (SPRING_PROFILES_DEFAULT
).
在 Spring Boot 中,您还可以在application.properties
,如以下示例所示:
-
Properties
-
YAML
spring.profiles.default=dev
spring:
profiles:
default: "dev"
有关更多信息,请参阅“Spring Boot 功能”部分中的配置文件。
根据环境更改配置
Spring Boot 支持多文档 YAML 和属性文件(有关详细信息,请参阅使用多文档文件),这些文件可以根据活动配置文件有条件地激活。
如果文档包含spring.config.activate.on-profile
键,则将 profiles 值(以逗号分隔的配置文件列表或配置文件表达式)输入到 SpringEnvironment.acceptsProfiles()
方法。
如果配置文件表达式匹配,则该文档将包含在最终合并中(否则,则不包括在内),如以下示例所示:
-
Properties
-
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。 如果“生产”处于活动状态,则端口为 0。
文档将按照遇到它们的顺序进行合并。 较晚的值将覆盖较早的值。 |
发现外部属性的内置选项
Spring Boot 将外部属性从application.properties
(或 YAML 文件和其他位置)在运行时转换为应用程序。
在单个位置没有(从技术上讲也不可能)所有受支持属性的详尽列表,因为贡献可能来自类路径上的其他 jar 文件。
具有 Actuator 功能的正在运行的应用程序具有configprops
端点,显示所有可用的绑定和可绑定属性@ConfigurationProperties
.
附录包括一个application.properties
示例,其中包含 Spring Boot 支持的最常见属性的列表。
最终列表来自搜索源代码@ConfigurationProperties
和@Value
注释以及偶尔使用Binder
.
有关加载属性的确切顺序的更多信息,请参阅外部化配置。