Spring Boot 2.0 新特性概述

2018年3月2日,Spring Boot终于迎来重大更新,对于喜欢boot的用户来说是一个好消息。我们都说,不看更新文档的程序猿,不是一个好攻城狮。但是,即便看了,不实践,最后慢慢也就忘了。于是,抽空翻译了一份,作为以后的一份参考指南来查阅。

基线JAVA 8并支持9

Spring Boot 2将JAVA 8作为基线版本。因为它开始大量利用java 8的特性来更新现有的API,比如:接口的默认方法,功能性回调,以及新的API等(比如,javax.time)。如果你正在使用JAVA 7或更早的版本,则需要升级之前的JDK之才可以启动boot应用。

Spring Boot 2在JDK 9下也能运行良好,并进行过兼容性测试。同时,所有的jar在模块系统中都带有自动模块条目的对应的兼容性清单。

第三方库升级

构建Spring Boot 2应用需要Spring Framwork 5.X 的支持。想要了解新特性,可以读文档Spring框架5中可用的新特性,并在继续之前检查它们的升级指南

Spring团队尽可能升级了其他相关第三方的最新稳定版本。本版本中一些值得注意的依赖升级包括:

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

Reactive Spring

Spring中的许多项目,现在都提供了开发反应式应用程序(Reactive Application)的最佳支持。反应式应用程序是完全异步和非阻塞的。它的目的是使用事件循环执行(event-loop execution model )模型(从而替代传统中的在每个请求执行模型中一个线程执行的方式)。Spring框架的参考文档中的“反应堆栈”部分提供了一个极好的入门说明。

Spring Boot 2.0通过自动配置和starter-POMs来支持反应式应用。 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。 有关详细信息,请参阅Spring Boot参考文档

Reactive Spring Data

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

Spring Boot针对这些技术的提供了独立的启动器POM。 比如,spring-boot-starter-data-mongodb-reactive提供了对mongo驱动程序项目的反应式的相关依赖。

Reactive Spring Security

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

使用WebFlux的Spring Security的访问规则可以通过SecurityWebFilterChain来进行配置。 如果你之前已经使用过Spring MVC,那应该会对Spring感到非常熟悉。 有关更多的详细信息,请参阅Spring Boot参考文档Spring Security文档

嵌入式Netty Server

由于WebFlux不依赖于Servlet API,Spring Boot是首次为Netty作为嵌入式服务器提供支持。 S、spring-Boot-starter-webflux启动器POM将引入Netty 4.1和Ractor Netty

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

支持 HTTP/2

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

有关详细信息,请参阅此“如何”部分。

配置属性绑定

在Spring Boot 2.0中,用于将环境属性绑定到@ConfigurationProperties的机制已经彻底改进。 我们借此机会收紧了松散绑定的规则,并修复了Spring Boot 1.x中的许多不一致之处。

新的Binder API也可以直接在您自己的代码中在@ConfigurationProperties之外使用。 例如,以下将绑定到PersonName对象列表:

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

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

my:
  property:
  - first-name: Jane
    last-name: Doe
  - first-name: John
    last-name: Doe

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

Property Origins

由Spring Boot加载的YAML文件和属性文件现在包含Origin信息,可以帮助您跟踪项目从何处加载。 几个Spring Boot功能利用这些信息并在适当时显示。

例如,在绑定失败时抛出的BindException类是一个OriginProvider。 这意味着起源信息可以很好地从故障分析器中显示出来。

另一个例子是env执行器端点,当它可用时包含原始信息。 下面的代码片断显示spring.security.user.name属性来自jar中打包的application.properties文件的第1行第27列:

{
  "name": "applicationConfig: [classpath:/application.properties]",
  "properties": {
    "spring.security.user.name": {
      "value": "user",
      "origin": "class path resource [application.properties]:1:27"
    }
  }
}

Converter

绑定使用了一个新的ApplicationConversionService类,它提供了一些对属性绑定特别有用的额外转换器。 最值得注意的是持续时间类型和分隔字符串的转换器。

持续时间转换器(Duration)允许持续时间以ISO-8601格式或简单字符串(例如10分钟10分钟)指定。 现有的属性已更改为始终使用持续时间。 @DurationUnit注释通过设置未指定的单位来确保后向兼容性。 例如,Spring Boot 1.5中预期秒数的属性现在具有@DurationUnit(ChronoUnit.SECONDS),以确保简单的值(例如10)实际上使用10秒。

分隔字符串转换器(Delimited string conversion)允许您将简单字符串绑定到集合或数组,而不必使用逗号分隔。 例如,LDAP base-dn属性使用@Delimiter(Delimiter.NONE),以便LDAP DNs(通常包含逗号)不会被误解。

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对执行器端点进行了许多改进和改进。所有HTTP执行器端点现在都暴露在/执行器路径下,并且生成的JSON有效载荷得到了改进。

我们现在也不会在默认情况下暴露很多端点。如果您要升级现有的Spring Boot 1.5应用程序,请务必查看迁移指南并特别注意management.endpoints.web.exposure.include属性。

Actuator JSON

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

现在许多Actuator 都具有更精确地反映底层数据的JSON。例如,/ actuators / conditions端点(Spring Boot 1.5中的/ autoconfig)现在有一个顶级上下文关键字来按ApplicationContext对结果进行分组。

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

支持Jersey和WebFlux

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

Actuator 端点现在提供HAL格式的响应,提供到所有活动端点的链接(即使您的类路径中没有Spring HATEOAS)。

执行器@Endpoints

为了支持Spring MVC,JMX,WebFlux和Jersey,我们为执行器端点开发了一种新的编程模型。 @Endpoint注释可以与@ReadOperation,@WriteOperation和@DeteteOperation结合使用,以技术不可知的方式开发端点。

您还可以使用@EndpointWebExtension或@EndpointJmxExtension将技术特定增强功能写入端点。详细信息请参阅更新的参考文档。

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池切换到HikariCP。我们发现Hakari提供了卓越的性能,不过,我们的许多用户更喜欢Tomcat Pool。

初始化

数据库初始化逻辑在Spring Boot 2.0中已经合理化。 Spring Batch,Spring Integration,Spring Session和Quartz的初始化现在默认情况下仅在使用嵌入式数据库时才会发生。已启用的属性已被替换为更具表现力的枚举。例如,如果你想总是执行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配置名称空间,可以轻松配置分页和排序。

Influx DB

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

Flyway/Liquibase Flexible Configuration

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

Hibernate

现在支持自定义Hibernate命名策略。 对于高级场景,您现在可以定义ImplicitNamingStrategy或PhysicalNamingStrategy以在上下文中用作常规Bean。

现在也可以通过公开HibernatePropertiesCustomizer bean,以更精细的方式定制Hibernate使用的属性。

MongoDB Client Customization

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

Redis

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

Quartz

自动配置支持现在包含在Quartz Scheduler中。 我们还增加了一种新型弹簧启动启动器 - 石英启动器POM。

您可以使用内存中的JobStores或完整的基于JDBC的存储。 Spring应用程序上下文中的所有JobDetail,Calendar和Trigger bean将自动注册到Scheduler中。

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

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

测试

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

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

现在使用@WebMvcTest和@WebFluxTest自动扫描Converter和GenericConverter bean。

已添加@AutoConfigureWebTestClient注释以提供WebTestClient bean以供测试使用。 注释会自动应用于@WebFluxTest测试。

新增了一个ApplicationContextRunner测试实用程序,这使得测试自动配置变得非常简单。 我们已将大部分内部测试套件移至此新模型。 详细信息请参阅更新的文档。

其它改进

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

当确定条件是否满足时,@ConditionalOnBean现在使用逻辑AND而不是逻辑OR。

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

春季CLI应用程序现在包含一个可用于创建Spring Security兼容哈希密码的encodepassword命令。

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

记录仪执行机构终端现在允许您将记录仪级别重置为默认值。

Spring Session用户现在可以通过会话执行器端点查找和删除会话。

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

我们的版本现在使用CI汇集,我们的项目POM文件已经重新编译,使它们更简单(这些更改对大多数用户应该是透明的,但是如果您发现有关已发布POM的任何问题,请报告它们)。

Animated ASCII Art

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

小结

Spring Boot 2.X的这次更新是一次非常重要的更新,信息量很大,虽然官方文档的每个小节都说得不多,但实际关联的知识量非常大,需要一定的学习时间,而里面最重要的,也是加入了对反应式编程模型的支持。

同时,还把JAVA版本强制提高到了8,这本身也是一个巨大的挑战,因为对于程序员们来说,函数式编程的学习成本非常高,虽然带来的收益也是巨大的,不过这又是一个革命的过程,需要时间来验证。只不过,在现在大数据的环境下,数据流变得越来越重要,函数编程会是趋势。

参考资源

1、Spring Boot 2.0官方文档:Spring Boot 2.0 Release Notes
2、Spring 5.X 新特性官方文档:the new features available in Spring Framework 5.0
3、Upgrading to Spring Framework 5.x
4、响应式流:Reactive Streams
5、Spring中的响应式Web:Web on Reactive Stack
6、Spring Boot reference documentation:boot-features-developing-web-applications
7、Spring Boot reference documentation:boot-features-security-webflux
8、Spring Security documentation
9、Configure HTTP/2
10、number of significant improvements.
11、代码地址:reference
12、Spring Boot Gradle Plugin 2.0.0.BUILD-SNAPSHOT API
13、Kotlin support section of the reference documentation.
14、Spring Boot 2.0 Migration Guide
15、Spring Boot Actuator Web API Documentation
16、Spring REST 说明文档:Spring REST Docs
17、Spring Boot reference documentation:50.8 Implementing Custom Endpoints
18、测试工具:micrometer.io
19、Spring Boot reference documentation:54. Metrics
20、第三方库:Quartz Scheduler
21、Spring Boot reference documentation:39. Quartz Scheduler
22、Spring Boot reference documentation:46.4 Testing your Auto-configuration
23、持续集成工具:concourse-ci
24、report them
25、demo-animated-banner
26、Relaxed Binding 2.0

猜你喜欢

转载自blog.csdn.net/mickjoust/article/details/79530571