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。
Hypermedia links
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