Spring Boot 2.0 Release Notes
Upgrading from Spring Boot 1.5
因为这是Spring Boot的一个主要版本,所以升级现有的应用程序可能比通常要复杂一些。我们制作了一个专门的迁移指南来帮助您升级现有的Spring Boot 1.5应用程序-dedicated migration guide。
如果您目前使用的是较早版本的Spring Boot,我们强烈建议您在迁移到Spring Boot 2.0之前先升级到Spring Boot 1.5=upgrade to Spring Boot 1.5 。
New and Noteworthy
Tip Check the configuration changelog 查看配置更改的完整概述。
Java 8 Baseline and Java 9 Support
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进行了测试。为了模块系统的兼容性,我们所有的jar都在清单中带有自动模块名条目。
Third-party Library Upgrades
pring Boot 2.0构建于并需要Spring Framework 5。您可能想了解Spring Framework 5.0中可用的新特性- the new features available in Spring Framework 5.0,并在继续之前查看它们的升级指南-upgrade guide。
我们已经尽可能地升级到其他第三方jar的最新稳定版本。这个版本中一些值得注意的依赖升级包括:
Tomcat 8.5
Flyway 5
Hibernate 5.2
Thymeleaf 3
Reactive Spring
Spring组合中的许多项目现在都为开发响应式应用程序-reactive applications提供了一流的支持。响应式应用程序是完全异步和非阻塞的。它们用于事件循环执行模型(而不是更传统的每个请求一个线程执行模型)。Spring Framework参考文档中的"Web on Reactive Stack"一节为这个主题提供了一个很好的入门指南。
Spring Boot 2.0通过自动配置和启动器poms( starter-POMs)完全支持响应式应用程序。Spring Boot本身的内部也进行了必要的更新,以提供响应性的alernative(最引人注目的是我们的嵌入式服务器支持)。
Spring WebFlux & WebFlux.fn
Spring WebFlux是Spring MVC的完全非阻塞响应式替代方案。Spring Boot为基于注解的Spring WebFlux应用程序提供了自动配置。而且WebFlux.fn提供了一个更实用的API。
要开始使用spring-boot-starter-webflux starter POM,它将提供由嵌入式Netty服务器支持的Spring WebFlux。详细信息请参阅Spring Boot参考文档-Spring Boot reference documentation。
Reactive Spring Data
在底层技术支持的情况下,Spring Data还提供了对响应式应用程序的支持。目前Cassandra, MongoDB, Couchbase和Redis都有响应式API支持。
Spring Boot包括针对这些技术的特殊启动器poms(starter-POMs),它们提供了启动所需的一切。例如,spring-boot-starter-data- mongob -reactive包含了对reactive mongo driver 和project reactor的依赖。
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 Boot reference documentation和Spring Security文档-Spring Security documentation。
Embedded Netty Server
因为WebFlux不依赖于Servlet APIs,所以我们现在第一次能够支持Netty作为嵌入式服务器。spring-boot-starter-webflux 启动器POM将拉入Netty 4.1和Ractor Netty。
备注:你只能使用Netty作为响应服务器。不提供阻塞servlet API支持。
HTTP/2 Support
Tomcat、Undertow和Jetty都支持HTTP/2。支持取决于所选择的web服务器和应用程序环境(因为JDK 8不支持该协议的开箱即用)。
查看 this "how to" section 了解更多细节。
Configuration Property Binding
在Spring Boot 2.0中,将环境属性绑定到@ConfigurationProperties的机制已被彻底修改。我们已经利用这个机会收紧了管理宽松绑定的规则,并且我们已经修正了Spring Boot 1.x中的许多不一致。
新的绑定器API也可以在@ConfigurationProperties之外直接在您自己的代码中使用。例如,下面的代码将绑定到一个PersonName对象列表:
配置源文件可以像这样在YAML中表示:
有关更新的绑定规则的更多信息, see this wiki page.
Property Origins
由Spring Boot加载的YAML文件和Properties 文件现在包含了原点(Origin )信息,可以帮助您跟踪项目从何处加载。一些Spring Boot特性利用了这一信息,并在适当的时候显示它。
例如,绑定失败时抛出的BindException类是一个OriginProvider。这意味着源信息可以从故障分析器中很好地显示出来。
另一个例子是env执行器端点,它包含可用的源信息。下面的代码片段显示了spring.security.user.name属性来自应用程序的第1行第27列。属性文件打包在jar中:
Converter Support
绑定使用了新的ApplicationConversionService类,该类提供了一些额外的转换器,这些转换器对属性绑定特别有用。最值得注意的是持续时间(Duration )类型和分隔字符串的转换器。
持续时间转换器允许以ISO-8601形式或简单字符串的形式指定持续时间(例如10m表示10分钟,支持其他单位- support of other units)。现有属性已更改为始终使用持续时间。例如,在应用程序中可以将会话超时时间配置为180秒。属性如下:
@DurationUnit注解通过设置未指定使用的单元来确保向后兼容性。例如,Spring Boot 1.5中的预期秒数的属性现在有@DurationUnit(ChronoUnit.SECONDS),以确保像10这样的简单值实际上使用10s。
带分隔符的字符串转换允许您将简单字符串绑定到集合或数组,而不必按逗号分隔。例如,LDAP的base-dn属性使用@Delimiter(Delimiter.NONE),以便LDAP DNs(通常包括逗号)不会被错误解释。
Gradle Plugin
Spring Boot的Gradle插件已经被大量重写,以实现一些显著的改进。你可以在它的参考-reference和api-api文档中阅读更多关于插件功能的信息。
Spring Boot现在需要Gradle 4.x。如果你正在升级一个使用Gradle的项目,请查看迁移指南-migration guide。
Kotlin
Spring Boot 2.0现在包括了对Kotlin 1.2.x的支持,并提供了一个runApplication函数,该函数提供了一种使用惯用的Kotlin运行Spring Boot 应用程序的方法。我们还公开和利用了其他Spring项目(如Spring Framework、Spring Data和Reactor)在其最近发布的版本中添加的Kotlin支持。
参考 Kotlin support section of the reference documentation 了解更多的信息。
Actuator Improvements
Spring Boot 2.0对执行器端点进行了许多改进和设计。所有HTTP执行器端点现在都公开在/actuator路径下,得到的JSON有效负载也得到了改进。
在默认情况下,我们现在也不会公开这么多端点。如果您正在升级现有的Spring Boot 1.5应用程序,请务必检查迁移指南-migration guide,并特别注意 management.endpoints.web.exposure.include 属性。
Actuator JSON
Spring Boot 2.0改进了许多端点返回的JSON有效负载。
许多端点现在都有了JSON,可以更准确地反映底层数据。例如,/actuator/conditions端点(Spring Boot 1.5中的/autoconfig)现在有一个顶级的上下文键来按ApplicationContext对结果进行分组。
现在还可以使用Spring REST Docs生成大量的REST API documentation,并随每个版本一起发布。
Jersey and WebFlux Support
除了Spring MVC和JMX支持之外,您现在还可以在开发纯Jersey或WebFlux应用程序时访问执行器端点。Jersey支持是通过自定义Jersey资源提供的,而WebFlux使用了自定义HandlerMapping。
Hypermedia links
现在, /actuator端点提供了一个HAL格式的响应,提供了到所有活动端点的链接(即使您的类路径上没有Spring HATEOAS)。
Actuator @Endpoints
为了支持Spring MVC、JMX、WebFlux和Jersey,我们为执行器端点开发了一个新的编程模型。@Endpoint注解可以与@ReadOperation、@WriteOperation和@DeleteOperation结合使用,以技术无关的方式开发端点。
您还可以使用@EndpointWebExtension 或@EndpointJmxExtension来编写对端点的特定于技术的增强。有关详细信息,请参阅更新后的参考文档- the updated reference documentation。
Micrometer
Spring Boot 2.0不再附带自己的度量APIs。相反,我们依靠 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。
有关更多细节,请参阅参考文档中更新的“度量”部分-"Metrics" section。
Data Support
除了上面提到的“Reactive Spring Data”支持外,在数据方面还进行了一些其他的更新和改进。
HikariCP
Spring Boot 2.0中默认的数据库池技术已经从Tomcat Pool切换到HikariCP。我们发现,Hakari提供了更好的性能,许多用户更喜欢它而不是Tomcat Pool。
Initialization
数据库初始化逻辑在Spring Boot 2.0中得到了合理化。Spring Batch、Spring Integration、Spring Session和Quartz的初始化现在默认只在使用和嵌入式数据库时进行。enabled属性已被替换为更具表现力的enum。例如,如果您希望始终执行Spring Batch初始化,您可以设置 spring.batch.initialize-schema=always。
If Flyway or Liquibase is managing the schema of your DataSource and you’re using an embedded database, Spring Boot will now automatically switch off Hibernate’s automatic DDL feature.
JOOQ
Spring Boot 2.0现在根据数据源自动检测jOOQ 方言 (类似于对JPA方言所做的)。还引入了一个新的@JooqTest注解,以简化只需要使用jOOQ的测试。
JdbcTemplate
Spring Boot自动配置的JdbcTemplate现在可以通过spring.jdbc.template属性自定义。另外,自动配置的NamedParameterJdbcTemplate在后台重用
Spring Data Web Configuration
Spring Boot公开了一个新的spring.data.web 配置命名空间。允许轻松配置分页和排序的web配置名称空间。
Influx DB
Spring Boot现在自动配置开源时间序列数据库InfluxDB。要启用流数据库支持,您需要设置一个spring.influx.url属性,并在类路径中包含fluxdb-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
Redis的默认缓存现在可以使用 spring.cache.redis.* 属性来配置。
Web
除了WebFlux和WebFlux.fn在上面提到的支持中,还进行了以下改进,以帮助开发web应用程序。
Context Path Logging
当使用嵌入式容器时,当应用程序启动时,上下文路径将与HTTP端口一起记录。例如,嵌入式Tomcat现在看起来是这样的:
Tomcat started on port(s): 8080 (http) with context path '/foo'
Web Filter Initialization
Web过滤器现在在所有支持的容器上都被主动初始化。
Thymeleaf
The Thymeleaf starter now includes thymeleaf-extras-java8time which provides support for javax.time types.
Thymeleaf starter现在包括Thymeleaf -extras-java8time,它提供了对javax.time类型的支持。
JSON Support
新的spring-boot-starter-json启动器收集必要的bits来读写JSON。它不仅提供了jackson-databind,而且在使用Java8时还提供了有用的模块:jackson-datatype-jdk8, jackson-datatype-jsr310和 jackson-module-parameter-names。这个新的启动器现在用于以前定义jackson-databind的地方。
如果你喜欢Jackson以外的东西,我们对GSON的支持在Spring Boot 2.0中有了很大的改进。我们还引入了对JSON-B的支持(包括JSON-B测试支持)。
Quartz
自动配置支持现在包括Quartz Scheduler。我们还增加了一个 spring-boot-starter-quartz starter POM。
您可以使用内存中的JobStores,或者完全基于jdbc的存储。Spring应用程序上下文中的所有JobDetail、Calendar 和Trigger bean都将自动注册到调度程序。
更多的细节,阅读参考文档 "Quartz Scheduler" section
Testing
Spring Boot 2.0提供了一些测试支持的增加和调整:
添加了一个新的@WebFluxTest注解,以支持对WebFlux应用程序进行“切片”测试。
现在可以用@WebMvcTest和@WebFluxTest自动扫描Converter和GenericConverter bean。
添加了@AutoConfigureWebTestClient注解,以提供一个WebTestClient bean供测试使用。注解会自动应用到@WebFluxTest测试。
添加了一个新的ApplicationContextRunner测试实用程序,这使得测试自动配置非常容易。我们已经将大部分内部测试套件迁移到这个新模型中。有关详细信息,请参阅更新后的文档-the updated documentation。
Miscellaneous
除了上面列出的变化,还有很多小的调整和改进,包括:
@ConditionalOnBean现在在确定是否满足条件时使用逻辑的AND,而不是逻辑的OR。
无条件类现在包含在自动配置报告中。
Spring CLI应用程序现在包含了一个encodepassword命令,可以使用它创建 Spring Security兼容的散列密码。
计划任务(即@EnableScheduling)可以使用计划任务执行器端点进行检查。
记录器执行器端点现在允许您将记录器级别重置为默认级别。
Spring Session用户现在可以通过会话执行器端点查找和删除会话。
使用spring-boot-starter-parent的基于maven的应用程序现在默认使用-parameters标志。
我们的构建现在使用concourse来进行CI,我们的项目POM文件也进行了重组,使它们更简单(这些更改对大多数用户应该是透明的,但如果您发现已发布的POM有任何问题,请报告它们-report them)。
Animated ASCII Art
最后,也是为了好玩,Spring Boot 2.0现在支持GIF动画横幅。查看这个项目-this project 的示例。