Spring Boot 2.0 新特性详解

图片

背景

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

从 Spring Boot 1.5 升级

因为 Spring Boot 2.0 的改变幅度有点大,因此升级现有的程序可能会比日常更大一些。react

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

若是要升级能够参考我明天要发布的文章:Spring Boot 2.0 迁移指南github

若是您目前正在运行较早版本的 Spring Boot,咱们强烈建议您在迁移到 Spring Boot 2.0 以前先升级到 Spring Boot 1.5。web

新的和值得注意的特性

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

起码 JDK 8 和支持 JDK 9

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

Spring Boot 2.0 经过了在 JDK 9 下的测试,能够在 JDK 9 下正常运行,。咱们全部的 jar 包都在模块系统兼容性的清单中附带了自动模块名称条目。mongodb

第三方库的升级

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 到 POM,它将提供由嵌入式 Netty 服务器支持的 Spring 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对象:

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

配置源能够像这样在 YAML 中表示:

1my:
2  property:
3  - first-name: zhisheng
4    last-name: tian
5  - first-name: zhisheng
6    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  "name": "applicationConfig: [classpath:/application.properties]",
3  "properties": {
4    "spring.security.user.name": {
5      "value": "user",
6      "origin": "class path resource [application.properties]:1:27"
7    }
8  }
9}

转换器支持

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 运行 Spring Boot 应用程序的方法。咱们还公开和利用了 Kotlin 对其余 Spring 项目(如Spring Framework,Spring Data 和 Reactor)已添加到其最近版本中的支持。

有关更多信息,请参阅参考文档的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 组合使用开发 endpoints。

您还可使用@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 如今看起来像这样:

1Tomcat 在端口上启动: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 初始化 POM。

您可使用内存JobStores中或完整的基于 JDBC 的存储。全部JobDetailCalendarTrigger从你的 Spring应用程序上下文豆将自动注册Scheduler

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

测试

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

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

  • ConverterGenericConverter豆类如今自动扫描@WebMvcTest@WebFluxTest

  • @AutoConfigureWebTestClient已经添加了一个注释来提供一个WebTestClientbean 供测试使用。注释会自动应用于@WebFluxTest测试。

  • 增长了一个新的ApplicationContextRunner测试实用程序,能够很容易地测试您的自动配置。咱们已将大部份内部测试套件移至此新模型。详细信息请参阅更新的文档。

其它

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

  • @ConditionalOnBean如今在肯定是否知足条件时使用逻辑AND而不是逻辑OR

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

  • springCLI 应用程序如今包括encodepassword可用于建立 Spring Security 的兼容散列密码命令。

  • 计划任务(即 @EnableScheduling)可使用scheduledtasks执行器端点进行审查。

  • loggers驱动器终端如今容许你从新设置一个记录器级别为它的默认。

  • Spring Session 用户如今能够经过sessions执行器端点查找和删除会话。

  • 使用spring-boot-starter-parent如今基于 Maven 的应用程序-parameters默认使用标志。

  • 咱们的构建如今使用 concourse 的 CI 和咱们的项目 POM 文件已被重构,使它们更简单的。

动画 ASCII 艺术

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

图片

参考资料

https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Release-Notes

关注我

图片

转载请务必注明原创地址为:http://www.54tianzhisheng.cn/2018/03/06/SpringBoot2-new-features/

相关文章
相关标签/搜索