对于最新的稳定版本,请使用 Spring Boot 3.4.0! |
属性和配置
本节包括有关设置和读取属性和配置设置以及它们与 Spring Boot 应用程序的交互的主题。
在构建时自动扩展属性
您可以使用现有的构建配置来自动扩展这些属性,而不是对项目的构建配置中指定的某些属性进行硬编码。 这在 Maven 和 Gradle 中都是可能的。
使用 Maven 自动扩展属性
您可以使用资源筛选自动扩展 Maven 项目中的属性。
如果使用 ,则可以用占位符引用 Maven 的“项目属性”,如以下示例所示:spring-boot-starter-parent
@..@
-
Properties
-
YAML
app:
encoding: "@project.build.sourceEncoding@"
java:
version: "@java.version@"
仅以这种方式过滤 生产配置 (换句话说,不应用过滤 )。src/test/resources |
如果启用该标志,则 goal 可以直接添加到 Classpath 中(用于热重载目的)。
这样做会规避资源筛选和此功能。
相反,您可以使用目标或自定义插件的配置。
有关更多详细信息,请参阅插件使用页面。addResources spring-boot:run src/main/resources exec:java |
如果您不使用 starter 父级,则需要在 :<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>
如果您在配置中使用标准 Spring 占位符(例如 ),则该属性非常重要。
如果该属性未设置为 ,则内部版本可能会扩展这些属性。useDefaultDelimiters ${placeholder} false |
使用 Gradle 自动扩展属性
您可以通过配置 Java 插件的任务来自动扩展 Gradle 项目中的属性,如以下示例所示:processResources
tasks.named('processResources') {
expand(project.properties)
}
然后,您可以使用占位符引用 Gradle 项目的属性,如以下示例所示:
-
Properties
-
YAML
app.name=${name}
app.description=${description}
app:
name: "${name}"
description: "${description}"
Gradle 的方法使用 Groovy 的 ,它转换令牌。
该样式与 Spring 自己的属性占位符机制冲突。
要将 Spring 属性占位符与自动扩展一起使用,请按如下方式转义 Spring 属性占位符:。expand SimpleTemplateEngine ${..} ${..} \${..} |
外部化 SpringApplication 的配置
SpringApplication
具有 Bean 属性 setter,因此您可以在创建应用程序时使用其 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)
}
}
或者 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<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
(来自外部配置)
更改应用程序的外部属性的位置
默认情况下,来自不同来源的属性将按定义的顺序添加到 Spring Environment
中(有关确切的顺序,请参阅“Spring Boot 功能”部分中的 Externalized Configuration)。
您还可以提供以下 System 属性(或环境变量)来更改行为:
-
spring.config.name
(SPRING_CONFIG_NAME
):默认为文件名的根目录。application
-
spring.config.location
(SPRING_CONFIG_LOCATION
):要加载的文件(例如类路径资源或 URL)。 为本文档设置了一个单独的Environment
属性源,它可以被系统属性、环境变量或命令行覆盖。
无论你在环境中设置什么, Spring Boot 始终如上所述加载。
默认情况下,如果使用 YAML,则扩展名为 '.yaml' 和 '.yml 的文件也会添加到列表中。application.properties
如果需要有关正在加载的文件的详细信息,可以将 的日志记录级别设置为 。org.springframework.boot.context.config trace |
使用 'short' 命令行参数
有些人喜欢在命令行上使用 (例如) 而不是设置配置属性。
您可以通过在 中使用占位符来启用此行为,如以下示例所示:--port=9000
--server.port=9000
application.properties
-
Properties
-
YAML
server.port=${port:8080}
server:
port: "${port:8080}"
如果从 POM 继承,则 default filter token 的 this 已从 更改为 (即,而不是 ),以防止与 Spring 样式占位符冲突。
如果您已为直接启用了 Maven 筛选,则可能还需要更改默认筛选条件令牌以使用其他分隔符。spring-boot-starter-parent maven-resources-plugins ${*} @ @maven.token@ ${maven.token} application.properties |
在此特定情况下,端口绑定在 PaaS 环境(如 Heroku 或 Cloud Foundry)中工作。
在这两个平台上,环境变量是自动设置的,Spring 可以绑定到 Environment 属性的大写同义词。PORT |
将 YAML 用于外部属性
YAML 是 JSON 的超集,因此,它是以分层格式存储外部属性的便捷语法,如以下示例所示:
spring:
application:
name: "cruncher"
datasource:
driver-class-name: "com.mysql.jdbc.Driver"
url: "jdbc:mysql://localhost/test"
server:
port: 9000
创建一个名为 的文件,并将其放在 Classpath 的根目录中。
然后添加到您的依赖项中(Maven 坐标 ,如果您使用 ,则已包含)。
YAML 文件被解析为 Java(如 JSON 对象),Spring Boot 将 Map 展平,使其深度为一层,并具有句点分隔的键,就像许多人习惯于 Java 中的 Properties
文件一样。application.yaml
snakeyaml
org.yaml:snakeyaml
spring-boot-starter
Map<String,Object>
前面的示例 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 配置文件
Spring Environment
有一个 API 来实现这一点,但你通常会设置一个 System 属性 () 或一个 OS 环境变量 () 。
此外,您可以使用参数启动应用程序(请记住将其放在主类或 jar 存档之前),如下所示:spring.profiles.active
SPRING_PROFILES_ACTIVE
-D
$ 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 属性或环境变量设置,而不是 method。
因此,后一个 Java API 可用于在不更改默认值的情况下扩充配置文件。SpringApplicationBuilder.profiles()
有关更多信息,请参见“ Spring Boot 功能”部分中的配置文件。
设置默认配置文件名称
默认配置文件是在没有活动配置文件时启用的配置文件。
默认情况下,默认配置文件的名称为 ,但可以使用 System 属性 () 或 OS 环境变量 () 进行更改。default
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 和属性文件(有关详细信息,请参见使用多文档文件),这些文件可以根据活动配置文件有条件地激活。
如果文档包含键,则 profiles 值(以逗号分隔的 profiles 列表或 profile 表达式)将馈送到 Spring 方法中。
如果配置文件表达式匹配,则该文档将包含在最终合并中(否则,它不包含),如以下示例所示:spring.config.activate.on-profile
Environment.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。 如果 'production' 处于活动状态,则端口为 0。
文档将按遇到它们的顺序进行合并。 较晚的值将覆盖较早的值。 |
发现外部属性的内置选项
Spring Boot 在运行时将外部属性(或 YAML 文件和其他地方)绑定到应用程序中。
没有(从技术上讲也不可能)在一个位置包含所有受支持属性的详尽列表,因为贡献可能来自 Classpath 上的其他 jar 文件。application.properties
具有 Actuator 功能的正在运行的应用程序具有一个端点,该端点显示通过 @ConfigurationProperties
提供的所有绑定和可绑定属性。configprops
附录包括一个application.properties
示例,其中包含 Spring Boot 支持的最常见属性的列表。
最终列表来自搜索源代码中的 @ConfigurationProperties
和 @Value
注释以及偶尔使用 Binder
。
有关加载属性的确切顺序的更多信息,请参阅 外部化配置。