背景

在 3 月 1 号,Spring Boot2.0.0.RELEASE正式发布,这是 Spring Boot1.0 发布 4 年之后第一次重大修订,因此有多的新功能和特性值得大家期待!下面带大家了解下 Spring Boot 2.0 中的新特性。

http://www.54tianzhisheng.cn/2018/03/06/SpringBoot2-new-features/

从 Spring Boot 1.5 升级

由于 Spring Boot 2.0 的改变幅度有点大,所以升级现有的程序可能会比平常更大一些。

如果你还在考虑是否要升级,这里推荐 DD 的博客文章:Spring Boot 2.0 正式发布,升还是不升呢?

如果要升级可以参考我的另外一篇文章:Spring Boot 2.0 迁移指南

如果您目前正在运行较早版本的 Spring Boot,我们强烈建议您在迁移到 Spring Boot 2.0 之前先升级到 Spring Boot 1.5。

新的和值得注意的特性

小技巧:检查 配置更改日志 来获取配置更改的完整描述。

起码 JDK 8 和支持 JDK 9

Spring Boot 2.0 要求 Java 8 作为最低版本。许多现有的 API 已更新,以利用 Java 8 的特性,例如:接口上的默认方法,函数回调以及新的 API,如javax.time。如果您当前正在使用 Java 7 或更早版本,则在开发 Spring Boot 2.0 应用程序之前,您需要升级您的 JDK。

Spring Boot 2.0 通过了在 JDK 9 下的测试,可以在 JDK 9 下正常运行,。我们所有的 jar 包都在模块系统兼容性的清单中附带了自动模块名称条目。

第三方库的升级

Spring Boot 2.0 建立在 Spring Framework 5 之上,并且需要 Spring Framework 5 。你可以通过 What’s New in Spring Framework 5.x 了解 Spring 5 的新特性。并在继续之前查看其升级指南 Upgrading to Spring Framework 5.x 。

我们已尽可能升级到其他第三方库的最新稳定版本。 本版本中一些显着的依赖性升级包括:

  • Tomcat 8.5
  • Flyway 5
  • Hibernate 5.2
  • Thymeleaf 3

Reactive Spring

Spring 产品组合中的许多项目现在都为开发反应式应用程序提供一流的支持。反应性应用程序是完全异步和非阻塞的。它们旨在用于事件循环执行模型(而不是更传统的每个请求线程执行模型)。Spring 框架参考文档中的“Web 反应堆栈”部分为这个主题提供了一个很好的入门。

Spring Boot 2.0 通过自动配置和启动器 POM 完全支持反应式应用。Spring Boot 的内部本身也在必要时进行了更新,以提供反应性的反应(最明显的是我们的嵌入式服务器支持)。

SPRING WEBFLUX&WEBFLUX.FN

Spring WebFlux 是 Spring MVC 的完全非阻塞反应式替代方案。Spring Boot 为基于注释的 Spring WebFlux 应用程序以及 WebFlux.fn 提供了自动配置,WebFlux.fn 提供了更实用的样式 API。

要开始,请添加 spring-boot-starter-webflux

REACTIVE SPRING DATA

在底层技术支持的情况下,Spring Data 还为反应式应用程序提供支持。目前 Cassandra,MongoDB,Couchbase 和 Redis 都有反应式 API 支持。

Spring Boot 包含针对这些技术的特殊 starter-POMs,可为您提供启动所需的一切。例如,spring-boot-starter-data-mongodb-reactive包括对反应性 mongo 驱动程序和项目反应堆的依赖性。

REACTIVE SPRING SECURITY

Spring Boot 2.0 可以充分利用 Spring Security 5.0 来保护您的反应式应用程序。当 Spring Security 位于类路径中时,会为 WebFlux 应用程序提供自动配置。

使用 WebFlux 的 Spring Security 访问规则可以通过SecurityWebFilterChain。如果你之前整合过 Spring MVC 和 Spring Security,应该会感到非常熟悉。有关更多详细信息,请参阅 Spring Boot 参考文档和 Spring Security 文档

嵌入式 NETTY 服务器

由于 WebFlux 不依赖于 Servlet API,我们现在可以首次为 Netty 作为嵌入式服务器提供支持。该spring-boot-starter-webflux 启动 POM 将拉取 Netty 4.1 和 Ractor Netty 。

注意:您只能将 Netty 用作反应式服务器。不提供阻止 servlet API 支持。

HTTP/2 支持

为 Tomcat,Undertow 和 Jetty 提供 HTTP / 2 支持。支持取决于所选的 Web 服务器和应用程序环境(因为 JDK 8 不支持该协议)。

如何配置 HTTP/2,请参考 官方文档 。

配置属性的绑定

在 Spring Boot 2.0 中,用于绑定Environment属性的机制@ConfigurationProperties已经完全彻底修改。我们借此机会收紧了松散绑定的规则,并修复了 Spring Boot 1.x 中的许多不一致之处。新的BinderAPI 也可以@ConfigurationProperties直接在你自己的代码之外使用。例如,下面将结合到ListPersonName对象:

1
2
3
List<PersonName> people = Binder.get(environment)
    .bind("my.property", Bindable.listOf(PersonName.class))
    .orElseThrow(IllegalStateException::new);

配置源可以像这样在 YAML 中表示:

1
2
3
4
5
6
my:
  property:
  - first-name: zhisheng
    last-name: tian
  - first-name: zhisheng
    last-name: tian

有关更新绑定规则的更多信息,请参阅此Wiki页面

配置起源

YAML 文件和被 Spring Boot 加载的 Properties 文件现在包含Origin信息,可帮助您跟踪项目从何处加载的信息。有些 Spring Boot 特性利用了这个信息可以在适当的时候展示出来。例如,BindException绑定失败时抛出的类是一个OriginProvider。这意味着原始信息可以很好地从故障分析器中显示出来。另一个例子是env执行器端点,当它有可用时包含了原始信息。下面的代码片断显示该spring.security.user.name属性来自 jar 包中的 application.properties 文件的第 1行,第 27 列。

1
2
3
4
5
6
7
8
9
{
  "name": "applicationConfig: [classpath:/application.properties]",
  "properties": {
    "spring.security.user.name": {
      "value": "user",
      "origin": "class path resource [application.properties]:1:27"
    }
  }
}
转换器支持

Binding 利用了一个新的 ApplicationConversionService 类,它提供了一些对属性绑定特别有用的额外转换器。最引人注目的是转换器的Duration类型和分隔字符串。该Duration转换器允许在任一 ISO-8601 格式中指定的持续时间,或作为一个简单的字符串(例如10m,10 分钟)。现有的属性已更改为始终使用Duration。该@DurationUnit注释通过设置如果没有指定所使用的单元确保向后兼容性。例如,Spring Boot 1.5 中需要秒数的属性现在必须@DurationUnit(ChronoUnit.SECONDS)确保一个简单的值,例如10实际使用的值10s。分隔字符串转换允许您将简单绑定StringCollectionArray不必分割逗号。例如,LDAP base-dn 属性用 @Delimiter(Delimiter.NONE),所以 LDAP DN(通常包含逗号)不会被错误解释。

Gradle 插件

Spring Boot 的 Gradle 插件已在很大程度上进行了重新编写,以实现许多重大改进。您可以在其参考文献和 API 文档中阅读关于插件功能的更多信息。

Spring Boot 现在需要 Gradle 4.x. 如果您要升级使用 Gradle 的项目,请查看迁移指南

Kotlin

Spring Boot 2.0 现在包含对 Kotlin 1.2.x 的支持,并提供了runApplication

有关更多信息,请参阅参考文档Kotlin支持部分

Actuator 改进

在 Spring Boot 2.0 中 Actuator endpoints 有很大的改进。所有 HTTP Actuator endpoints 现在都在该/actuator路径下公开,并且生成的 JSON 有效负载得到了改进。我们现在也不会在默认情况下暴露很多端点。如果您要升级现有的 Spring Boot 1.5 应用程序,请务必查看迁移指南并特别注意该management.endpoints.web.exposure.include属性。

ACTUATOR JSON

Spring Boot 2.0 改进了从许多端点返回的 JSON 有效负载。

现在许多端点都具有更精确地反映底层数据的 JSON。例如,/actuator/conditions终端(/autoconfig在Spring Boot 1.5中)现在有一个顶级contexts密钥来将结果分组ApplicationContext

现在还使用 Spring REST Docs 生成了广泛的 REST API 文档,并随每个版本发布。

JERSEY AND WEBFLUX 支持

除了支持 Spring MVC 和 JMX,您现在可以在开发 Jersey 或 WebFlux 应用程序时访问执行器端点。Jersey 支持通过自定义 Jersey 提供Resource,WebFlux 使用自定义HandlerMapping

HYPERMEDIA LINKS

/actuator端点现在提供了一个 HAL 格式的响应提供链接到所有活动端点(即使你没有 Spring HATEOAS 在classpath)。

ACTUATOR @ENDPOINTS

为了支持 Spring MVC,JMX,WebFlux 和 Jersey,我们为 Actuator @Endpoints 开发了一种新的编程模型。该@Endpoint注解可以与@ReadOperation@WriteOperation 和 @DeleteOperation您还可以使用@EndpointWebExtension@EndpointJmxExtension编写技术特定的增强功能到 endpoints。详细信息请参阅更新的参考文档

MICROMETER

Spring Boot 2.0 不再提供自己的指标 API。相反,我们依靠 micrometer.io 来满足所有应用程序监视需求。

Micrometer 包括尺寸指标的支持,当与尺寸监测系统配对时,尺寸指标可以有效访问特定的指定度量标准,并且可以在其尺寸范围内向下钻取。

指标可以输出到各种系统和开箱即用的 Spring Boot 2.0,为 Atlas,Datadog,Ganglia,Graphite,Influx,JMX,New Relic,Prometheus,SignalFx,StatsD 和 Wavefront 提供支持。另外还可以使用简单的内存中度量标准。

集成随 JVM 指标(包括 CPU,内存,线程和 GC),Logback,Tomcat,Spring MVC&提供RestTemplate

有关更多详细信息,请参阅参考文档的更新“指标”部分

数据支持

除了上面提到的 Reactive Spring Data

HIKARICP

Spring Boot 2.0 中的默认数据库池技术已从 Tomcat Pool 切换到 HikariCP。我们发现 Hakari 提供了卓越的性能,我们的许多用户更喜欢 Tomcat Pool。

初始化

数据库初始化逻辑在 Spring Boot 2.0 中已经合理化。Spring Batch,Spring Integration,Spring Session 和 Quartz的初始化现在仅在使用嵌入式数据库时才会默认发生。该enabled属性已被替换为更具表现力枚举。例如,如果你想一直执行 Spring Batch 的初始化,您可以设置spring.batch.initialize-schema=always

如果 Flyway 或 Liquibase 正在管理您的 DataSource 的模式,并且您正在使用嵌入式数据库,Spring Boot 现在会自动关闭 Hibernate 的自动 DDL 功能。

JOOQ

Spring Boot 2.0 现在基于 DataSource 自动检测 JOOQ 方言(类似于为 JPA 方言所做的)。@JooqTest是新引入的注解用来简化那些只有 JOOQ 必须被使用的测试。

JDBCTEMPLATE

Spring Boot 自动配置的 JdbcTemplate 现在可以通过 spring.jdbc.template 属性进行自定义。此外,NamedParameterJdbcTemplate自动配置的内容会重用JdbcTemplate

SPRING DATA WEB 配置

Spring Boot 公开了一个新的spring.data.web配置名称空间,可以轻松配置分页和排序。

INFLUXDB

Spring Boot 现在自动配置开源时间序列数据库 InfluxDB。要启用 InfluxDB 支持,您需要设置一个spring.influx.url属性,并将其包含influxdb-java在您的类路径中。

FLYWAY/LIQUIBASE 灵活配置

如果仅提供自定义urluser属性,则 Flyway 和 Liquibase 的自动配置现在将重用标准数据源属性,而不是忽略它们。这使您可以创建一个自定义的数据源,仅用于所需信息的迁移。

HIBERNATE

现在支持自定义 Hibernate 命名策略。对于高级场景,现在可以在上下文中定义ImplicitNamingStrategyPhysicalNamingStrategy使用常规 bean。现在也可以通过公开HibernatePropertiesCustomizerbean 来更加细致地定制 Hibernate 使用的属性。

MONGODB 客户端自定义

现在可以通过定义一个类型的 bean 来为 Spring Boot 自动配置的 Mongo 客户端应用高级定制MongoClientSettingsBuilderCustomizer

REDIS

现在可以使用spring.cache.redis.*属性配置 Redis 的缓存默认值。

Web

除了上面提到的 WebFlux 和 WebFlux.fn 支持之外,还在开发 Web 应用程序时进行了以下改进。

上下文路径记录

当使用嵌入式容器时,当您的应用程序启动时,上下文路径将与 HTTP 端口一起记录。例如,嵌入式 Tomcat 现在看起来像这样:

1
Tomcat 在端口上启动:8080(http),其上下文路径为 '/foo'
WEB过滤器初始化

Web 过滤器现在在所有支持的容器上急切地初始化。

THYMELEAF

Thymeleaf 初始化现在包括thymeleaf-extras-java8time,提供javax.time类型支持。

JSON 支持

新的spring-boot-starter-json起始者收集必要的位以读取和写入 JSON。它不仅提供了jackson-databind与Java8 工作时,也是有用的模块:jackson-datatype-jdk8jackson-datatype-jsr310jackson-module-parameter-names。这个新的起动器现在被用于jackson-databind之前定义的地方。

如果您更喜欢 Jackson 之外的其他产品,我们对 GSON 的支持在 Spring Boot 2.0 已经大大提高。我们还引入了对 JSON-B 的支持(包括 JSON-B 测试支持)。

Quartz

自动配置支持目前包含了 Quartz Scheduler。我们还添加了新的spring-boot-starter-quartz您可以使用内存JobStores中或完整的基于 JDBC 的存储。所有JobDetailCalendarTrigger从你的 Spring应用程序上下文豆将自动注册Scheduler

有关更多详细信息,请阅读参考文档的新“Quartz Scheduler”部分

测试

对 Spring Boot 2.0 中提供的测试支持进行了一些补充和调整:

@WebFluxTest

  • 已添加新注释以支持 WebFlux 应用程序的“切片”测试。

Converter

GenericConverter

  • 豆类现在自动扫描

@WebMvcTest

@WebFluxTest

@AutoConfigureWebTestClient

  • 已经添加了一个注释来提供一个

WebTestClient

  • bean 供测试使用。注释会自动应用于

@WebFluxTest

  • 测试。
  • 增加了一个新的

ApplicationContextRunner

  • 测试实用程序,可以很容易地测试您的自动配置。我们已将大部分内部测试套件移至此新模型。详细信息请参阅更新的文档

其它

除了上面列出的变化外,还有很多小的调整和改进,包括:

@ConditionalOnBean

  • 现在在确定是否满足条件时使用逻辑

AND

  • 而不是逻辑

OR

  • 无条件类现在包含在自动配置报告中。

spring

  • CLI 应用程序现在包括

encodepassword

  • 可用于创建 Spring Security 的兼容散列密码命令。
  • 计划任务(即 

@EnableScheduling

  • )可以使用

scheduledtasks

  • 执行器端点进行审查。

loggers

  • 驱动器终端现在允许你重新设置一个记录器级别为它的默认。
  • Spring Session 用户现在可以通过

sessions

  • 执行器端点查找和删除会话。
  • 使用

spring-boot-starter-parent

  • 现在基于 Maven 的应用程序

-parameters

  • 默认使用标志。
  • 我们的构建现在使用 concourse 的 CI 和我们的项目 POM 文件已被重构,使它们更简单的。

动画 ASCII 艺术

最后,为了好玩,Spring Boot 2.0 现在支持动画 GIF 横幅。