属性与配置
本节包括设置和读取属性、配置设置及其与 Spring Boot 应用程序交互的主题。
在构建时自动扩展属性
你不必硬编码项目构建配置中也指定的一些属性,而是通过使用现有构建配置来自动扩展它们。 这在Maven和Gradle中都可行。
利用Maven进行自动属性扩展
你可以在 Maven 项目中使用资源过滤自动扩展属性。
如果你使用了Spring靴启动父然后你可以用 Maven 来称呼你的“项目属性”@..@占位符,如下例所示:
-
Properties
-
YAML
app:
encoding: "@project.build.sourceEncoding@"
java:
version: "@java.version@"
只有生产配置会这样过滤(换句话说,没有对 进行过滤SRC/测试/资源). |
如果你启用了addResources旗帜,该Spring Boot:跑目标可以添加src/主/资源直接连接到类路径(用于热加载)。
这样做可以绕过资源过滤和这个功能。
相反,你可以使用exec:Java目标或自定义插件配置。
详情请参见插件使用页面。 |
如果你不使用起始父节点,你需要在<建造/建造>你的元素pom.xml:
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
你还需要包含以下元素<插件/>:
<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占位符(例如,属性)非常重要${占位符})在你的配置中。
如果该性质未被设置为false这些都可以通过构建来扩展。 |
利用Gradle进行自动属性扩展
你可以通过配置 Java 插件process资源任务,如下示例所示:
tasks.named('processResources') {
expand(project.properties)
}
然后,您可以使用占位符来引用 Gradle 项目的属性,如下示例所示:
-
Properties
-
YAML
app.name=${name}
app.description=${description}
app:
name: "${name}"
description: "${description}"
Gradle的扩大方法 使用 Groovy 的方法SimpleTemplateEngine,变换为${..}Tokens。
这${..}风格与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)
}
}
或者资料来源(...)方法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"
实际应用会显示横幅(配置覆盖的配置),并使用三个源来表示应用上下文.
申请来源包括:
-
我的应用(摘自代码) -
MyDatabaseConfig(来自外部配置) -
MyJmsConfig(来自外部配置)
更改应用程序外部属性的位置
你还可以提供以下系统属性(或环境变量)来更改行为:
-
spring.config.name(SPRING_CONFIG_NAME):应用作为文件名的根节点。 -
spring.config.location(SPRING_CONFIG_LOCATION): 加载文件(例如类路径资源或URL)。 一个独立的环境该文档设置了属性源代码,可以被系统属性、环境变量或命令行覆盖。
无论你在环境中设置什么,Spring Boot 总是能加载application.properties如上所述。
默认情况下,如果使用 YAML,则带有 '.yaml' 和 '.yml' 扩展名的文件也会被添加到列表中。
如果你想了解加载文件的详细信息,可以设置日志级别org.springframework.boot.context.config自跟踪. |
使用“简短”命令行参数
有些人喜欢用(例如)--port=9000而不是--server.port=9000在命令行设置配置属性。
你可以通过使用占位符来启用这种行为application.properties如下例所示:
-
Properties
-
YAML
server.port=${port:8080}
server:
port: "${port:8080}"
如果你从中继承Spring靴启动父POM,是Maven-resources-plugins被改为 到 (即,${*}@@maven.token(.token)@而不是${maven.token})以防止与Spring风格占位符冲突。
如果你启用了 Maven 过滤功能application.properties直接来说,你可能还想更改默认过滤器Tokens,使用其他分隔符。 |
在这个具体情况下,端口绑定可以在像Heroku或Cloud Foundry这样的PaaS环境中工作。
在这两个平台上,端口environment 变量是自动设置的,Spring 可以绑定为环境性能。 |
外部属性使用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把它放在你的职业路径根节点。
然后加上斯纳凯亚姆尔连接到你的依赖关系(Maven坐标)org.yaml:snakeyaml如果你使用以下条件,已经包含在内Spring靴Starters).
YAML 文件解析为 Java 文件地图<字符串,对象>(类似JSON对象),而Spring Boot则将映射压平,使其深度为一层,并使用周期分隔键,正如许多人习惯的那样性能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 Features”部分的“使用 YAML”。
设置活跃的Spring配置文件
Spring环境有API,但通常你会设置系统属性(春季.档案.活跃)或作系统环境变量(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"
以这种方式设置的值会被系统属性或环境变量设置替代,但不会被SpringApplicationBuilder.profiles()方法。
因此,后者的 Java API 可以用来增强配置文件,而无需更改默认值。
更多信息请参见“Spring Boot功能”部分的配置文件。
设置默认配置文件名称
默认配置文件是指如果没有激活配置文件,该配置文件会被启用。
默认情况下,默认配置文件的名称为默认值但可以用系统属性(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-profilekey,然后将配置文件的值(逗号分隔的配置文件列表或配置文件表达式)输入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。 然而,如果名为“开发”的 Spring 配置文件处于激活状态,那么该端口是 9001。 如果“生产”激活,那么端口为0。
| 这些文件按遇到的顺序合并。 后期的值会覆盖之前的值。 |
发现外部房产的内置选项
Spring Boot 绑定外部属性application.properties(或 YAML 文件及其他存储点)在运行时被应用处理。
没有(也技术上不可能)在一个地方列出所有支持属性的详尽列表,因为贡献可能来自类路径上的额外 jar 文件。
具有执行器功能的运行应用程序具有配置道具端点显示所有可绑定和可绑定的属性,通过以下方式@ConfigurationProperties.
附录中包含application.properties示例中列出了 Spring Boot 支持的最常见属性。
最终的列表来自于检索源代码@ConfigurationProperties和@Value注释以及偶尔的使用粘结 剂.
关于载荷属性的具体顺序,请参见外部化配置。