以Java 8 为基准并支持Java9
Spring Boot 2.0 要求Java必须8及以上版本。Spring之前提供的许多API已经采用Java8语法改写,例如接口默认方法,函数式接口,新的事件API等。SpringBoot2.0也支持Java9,并且经过了兼容性测试。SpringBoot2.0中许多配置属性被重命名或移除。SpringBoot提供了如下模块用于帮助应用升级,在POM添加即可实现在应用启动时分析应用程序的环境打印诊断信息,并在运行时临时迁移配置属性。
注意:应用程序升级完成后,一定要移除该依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-properties-migrator</artifactId>
<scope>runtime</scope>
</dependency>
第三方库升级
SpringBoot2.0需要Spring Framwork 5.的支持,可以通过如下链接查看Spring5 的型特性
https://github.com/spring-projects/spring-framework/wiki/What%27s-New-in-Spring-Framework-5.x
其他第三库最低版本升级依赖:
Tomcat 8.5
Flyway 5
Hibernate 5.2
Thymeleaf 3
Elasticsearch 5.6
Gradle 4
Jetty 9.4
Spring Security 5
Spring Integration 5
内嵌容器包结构调整
为了支持reactive使用场景,内嵌的容器包结构被重构了的幅度有点大。EmbeddedServletContainer被重命名为WebServer,并且org.springframework.boot.context.embedded 包被重定向到了org.springframework.boot.web.embedded包下。EmbeddedServletContainerCustomizer被重命名为WebServerFactoryCustomizer
举个例子,如果要使用TomcatEmbeddedServletContainerFactory回调接口来自定义内嵌Tomcat容器,你现在应该使用TomcatServletWebServerFactory。
Starter 的传递依赖的改变
以前有几个Spring Boot starter是依靠Spring MVC和spring-boot-starter-web传递的。 为了对Spring WebFlux的支持,spring-boot-starter-mustache和spring-boot-starter-thymeleaf不再依赖spring-boot-starter-web。现在需要自己选择并添加spring-boot-starter-web或spring-boot-starter-webflux作为依赖。
注意:web和webflux是平行的关系。
Servlet-specific 的server properties调整
大量的Servlet专属的server.* properties被移到了server.servlet下:
Old property | New property |
server.context-parameters.* | server.servlet.context-parameters.* |
server.context-path | server.servlet.context-path |
server.jsp.class-name | server.servlet.jsp.class-name |
server.jsp.init-parameters.* | server.servlet.jsp.init-parameters.* |
server.jsp.registered | server.servlet.jsp.registered |
server.servlet-path | server.servlet.path |
@ConditionalOnBean判断条件变化
@ConditionalOnBean现在的判断条件由OR变为了AND。在配置类中定义Bean,如果使用@ConditionalOnBean依赖的也是配置类中Bean,则执行结果不可控,和配置类加载顺序有关
Reactive Spring
Spring中的许多项目,现在都提供了开发反应式应用程序支持。反应式应用程序是完全异步和非阻塞的。它的目的是使用事件循环执行(event-loop execution model )模型(从而替代传统中的在每个请求执行模型中一个线程执行的方式)。关于"Web on Reactive Stack"部分
可以参考https://docs.spring.io/spring/docs/current/spring-framework-reference/web-reactive.html
SpringBoot2.0通过自动配置和starter-POMs支持反应式应用,Spring Boot的内部本身也在必要时进行了更新,以提供反应式的支持(最明显的是提供的嵌入式服务器支持)。
Spring WebFlux & WebFlux.fn
Spring WebFlux是Spring MVC的完全非阻塞的反应式的替代方案。 Spring Boot为基于注释的Spring WebFlux应用程序以及WebFlux.fn提供了自动配置,WebFlux.fn提供了更实用的函数式API。针对WebFlux, Spring Boot 2.0 提供了一个新的starter,通过如下pom配置:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
Embedded Netty Server
由于WebFlux不依赖于Servlet API,Spring Boot默认使用netty作为反应式服务器。
当导入Webflux的依赖,会同时引入Netty和Ractor Netty。
注意:只能将netty用作反应式服务器,不能提供阻塞式的Servlet API支持。
Reactive Spring Data
Spring-Data也为反应式应用程序提供支持,目前针对Cassandra,MongoDB,Couchbase和Redis都有支持反应式的API。Spring Boot针对这些技术提供了独立的启动器POM。 比如,spring-boot-starter-data-mongodb-reactive提供了对mongo驱动程序项目的反应式的相关依赖
MongoDB (spring-boot-starter-data-mongodb-reactive)
Redis (spring-boot-starter-data-redis-reactive)
Cassandra (spring-boot-starter-data-cassandra-reactive)
Couchbase (spring-boot-starter-data-couchbase-reactive)
@DataMongoTest测试注解也是支持reactive的。
Reactive Spring Security
Spring Boot 2还可以利用Spring Security 5.0来保护你的反应式应用程序。 当Spring Security位于类路径中时,就会为WebFlux应用程序提供自动配置。使用WebFlux的Spring Security的访问规则可以通过SecurityWebFilterChain来进行配置。
SpringBoot参考文档:
https://docs.spring.io/spring-boot/docs/2.0.x/reference/htmlsingle/#boot-features-security-webflux
SpringSecurity参考文档:
https://docs.spring.io/spring-security/site/docs/5.0.0.RELEASE/reference/htmlsingle/#jc-webflux
支持 HTTP/2
新版本为Tomcat,Undertow和Jetty提供HTTP / 2支持。 支持取决于所选的Web服务器和应用程序环境(因为JDK 8不支持该协议)
松绑定改善
1、org.springframework.boot.bind已经被移除, RelaxedPropertyResolver无法再使用,而是被org.springframework.boot.context.properties.bind.Binder替换。
2、松绑定已经得到改善。简单的属性在删除特殊字符然后转成小写后进行绑定。比如:
下面的属性最终都会被映射为spring.jpa.databaseplatform=mysql:
spring.jpa.database-platform=mysql
spring.jpa.databasePlatform=mysql
spring.JPA.database_platform=mysql
参考文档:https://github.com/spring-projects/spring-boot/wiki/Relaxed-Binding-2.0
配置属性绑定
在Spring Boot 2.0中,用于将环境属性绑定到@ConfigurationProperties的机制已经彻底改进。 我们借此机会收紧了松散绑定的规则, 新的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
Binding 对static 方法不再支持
SpringBoot1.x中可以通过静态的setter,getter方法将值绑定到静态属性,SpringBoot2.x不再支持。
spring.config.location属性行为改变
之前的版本中,使用spring.config.location会将配置添加到默认配置集合中,SpringBoot2.0中是直接替换默认设置,如果仅仅是想追加配置文件地址到默认配置地址,可以通过属性spring.config.additional-location设置
Converter Support
Binding 利用了一个新的 ApplicationConversionService 类,它提供了一些对属性绑定特别有用的额外转换器。最引人注目的是转换器的Duration类型和分隔字符串。
String time = "10s";
ConversionService conversionService = ApplicationConversionService.getSharedInstance();
Duration convert = conversionService.convert(time, Duration.class);
@ConfigurationProperties
@ConfigurationProperties里的ignoreNestedProperties属性已被删除。
可以通过@Validated注解开启@ConfigurationProperties对象验证。
Actuator改进
- SpringBoot2.0对actuator endpointbs进行了改进,默认不再暴露过多的信息,可以通过属性management.endpoints.web.exposure.include设置。
- 许多端点现在都有更准确地反映底层数据的JSON,参考文档:
https://docs.spring.io/spring-boot/docs/2.0.x/actuator-api/html/
- Actuator 端点现在提供HAL格式的响应,提供到所有活动端点的链接(即使类路径中没有Spring HATEOAS)。
支持Jersey和WebFlux
除了支持Spring MVC和JMX,您现在可以在开发Jersey或WebFlux应用程序时访问执行器端点。 Jersey支持通过自定义Jersey资源提供,WebFlux使用自定义HandlerMapping。
Actuator @Endpoints
为了支持Spring MVC,JMX,WebFlux和Jersey,我们为执行器端点开发了一种新的编程模型。 @Endpoint注释可以与@ReadOperation,@WriteOperation和@DeteteOperation结合使用,以技术不可知的方式开发端点。可以使用@EndpointWebExtension或@EndpointJmxExtension将技术特定增强功能写入端点。参考:https://docs.spring.io/spring-boot/docs/2.0.x/reference/htmlsingle/#production-ready-endpoints-custom
Micrometer
Spring Boot 2.0不再提供自己的指标API。相反,我们依靠micrometer.io来满足所有应用程序监视需求。
参考文档:https://docs.spring.io/spring-boot/docs/2.0.x/reference/htmlsingle/#production-ready-metrics
默认数据源连接池变为HikariCP
默认的连接池已经由Tomcat切换到了HikariCP。如果你过去使用spring.datasource.type在基于Tomcat的应用程序中强制使用Hikari,现在你可以删除这个覆盖了。同样的,如果想要使用Tomcat的连接池,只需要简单的加入以下配置就可以了:
spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource
Database Initialization
数据库初始化逻辑在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功能。
属性spring.datasource.initialization-mode替换spring.datasource.initialize并提供更多的控制。
jOOQ
Spring Boot现在可以根据DataSource自动检测出jOOQ方言(类似于JPA方言)。
此外,还引入了@JooqTest用于只有jOOQ才能hold的测试场景。
JdbcTemplate
Spring Boot自动配置(auto-configuration)的JdbcTemplate现在可以通过spring.jdbc.template命名空间进行定制。 此外,自动配置(auto-configuration)的NamedParameterJdbcTemplate在底层就是JdbcTemplate。
InfluxDB
如果InfluxDB java client 和 the spring.influx.url 被设置, 一个InfluxDB client现在就会被自动配置。而且现在支持认证。
Flyway/Liquibase 灵活配置
如果仅提供自定义url或user属性,则Flyway和Liquibase的自动配置现在将重用标准数据源属性,而不是忽略它们。可以创建一个自定义的数据源,仅用于所需信息的迁移。
Liquibase 和 Flyway 配置的key 已被转移到了spring 的命名空间下:(比如: spring.liquibase and spring.flyway )。
Hibernate
现在支持自定义Hibernate命名策略。 对于高级场景,您现在可以定义ImplicitNamingStrategy或PhysicalNamingStrategy以在上下文中用作常规Bean。现在也可以通过公开HibernatePropertiesCustomizer bean,以更精细的方式定制Hibernate使用的属性。
MongoDB 客户端自定义
现在可以通过定义MongoClientSettingsBuilderCustomizer类型的bean来将高级定制应用于Spring Boot自动配置的Mongo客户端。
Redis缓存及驱动变化
- 现在可以使用spring.cache.redis.*属性配置Redis的缓存默认值。增加了redis缓存存活时间属性spring.cache.redis.time-to-live,SpringBoot2.0 之前没有该功能。
- Redis客户端驱动由Jedis变为Lettuce,但仍然支持Jedis,可以通过排除io.lettuce:lettuce-core,添加redis.clients:jedis启用Jedis
Hazelcast缓存不再支持
不再自动配置HazelcastInstance进行缓存。因此,spring.cache.hazelcast.config属性不再可用。
Guava缓存不再支持
GuavaCacheManager被移除,不在自动配置Guava缓存,采用CaffeineCacheManager替换,使用Caffiene替换Guava缓存。
Quartz 定时器
SpringBoot2.0提供了Quartz Scheduler的自动配置,通过spring-boot-starter-quartz POM开启,可以使用内存中的JobStores或完整的基于JDBC的存储。 Spring应用程序上下文中的所有JobDetail,Calendar和Trigger bean将自动注册到Scheduler中。
参考文档:https://docs.spring.io/spring-boot/docs/2.0.x/reference/htmlsingle/#boot-features-quartz
默认代理策略
Spring Boot现在默认是使用CGLIB代理,同时包含AOP支持。如果你需要基于JDK接口的代理策略,需要把spring.aop.proxy-target-class设置为false。
Web Environment
SpringBobot2.0可以在多种模式下运行,因此spring.main.web-environment属性被废弃,而是通过属性spring.main.web-application-type来提供更多控制,例如:如果不想启动一个web服务可以如下设置:spring.main.web-application-type=none
如果是通过编程的方式可以通过SpringApplication的setWebApplicationType方法设置
新增事件ApplicationStartedEvent
SpringBoot2.0添加了一个新的事件ApplicationStartedEvent,该事件在context刷新后,ApplicationRunner和CommandLineRunner被调用前执行。而ApplicationReadyEvent是在这两个runner被调用后执行。参考文档:https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/html/spring-boot-features.html#boot-features-application-events-and-listeners
Banner 属性前缀改变
SpringBoot为了减少属性根命令空间,原先关于banner的属性,现在更改为spring.banner.
Json starter / Jackson
在2.0中,我们将Jackson配置默认设置为将JSR-310日期写为ISO-8601字符串。如果要返回先前的行为,可以添加spring.jackson.serialization.write-dates-as-timestamps=true到配置中。
新的spring-boot-starter-json starter 聚合了很多常用的json工具,可以支持对json的读写。它不仅仅提供了jackson-databind而且当你使用java8时候,还提供了有用的模块:jackson-datatype-jdk8, jackson-datatype-jsr310 和 jackson-module-parameter-names。
以前需要手动依赖的这些模块现在可以通过这个starter直接使用。
SpringMVC请求路径匹配默认行为改变
在2.0之前的版本中,SpringMVC默认会使用.* suffix匹配请求路径,也就是如果Controller请求方法上设置 /person 路径时等同于 /person.* ,当请求url是/person.pdf 或是 /person.json时都是映射到 /person 请求。在SpringBoot2.0中默认关闭了*.suffix匹配规则,如果请求的url是/person.pdf 将不会再匹配到/person。
http返回406案例:在一次开发过程中,前端定义了名称为error.js 的静态文件放在SpringBoot的静态资源中,而SpringBoot中有个默认路径为/error的BasicErrorController用于处理异常请求,当前端请求error.js时http返回码是406,原因在于请求error.js浏览器希望得到的返回头是application/JavaScript,而/error.js正好匹配/error.*,因此被BasicErrorController的/error处理返回的是 application/json,导致406问题。
Servlet Filters
针对一个Filter默认的dispatcher类型现在为 DipatcherType.REQUEST,这样就保证了Spring Boot和Servlet默认的配置统一了。
Spring Security
Spring Security的 filter 现在可以自动配置如下类型了: ASYNC, ERROR, and REQUEST 。这样就让Spring Boot中的配置和Spring Security默认配置保持一致了。
Spring Session
Spring Session的 filter 现在支持自动配置如下dispatcher类型 ASYNC, ERROR, and REQUEST 。同样是为了让Spring Boot的配置与Spring Session的默认配置保持一致。值得注意的是从Spring Session 2.0起, Mongo和GemFire 将不再被支持。
Remote CRaSH shell
spring-boot-starter-remote-shell不可用
1.5的时候此远程工具被标为deprecated,2.0的时候将会把这个支持彻底remove掉,以及基于此功能的项目也会被删除掉。
Spring Loaded不再支持
由于Spring Loaded项目已被移到了attic了,所以不再支持Spring Loaded了。现在建议你去使用Devtools。Spring Loaded不再支持了。
SendGrid
SendGrid最低支持版本是3.2。为了支持这次升级,username和password已经被干掉了。因为API key现在是唯一支持的认证方式。
基于CLI的测试
从Spring Boot的CLI中删除了测试支持,现在建议使用Maven或Gradle构建应用程序,去使用它们提供的丰富的测试支持。
Multipart配置改变
为了更好的反映Servlet的特性, spring.http.multipart. 属性已经被命名为 spring.servlet.multipart。便于区分servlet和webflux区分开来。
Mustache 模板默认文件扩展名
过去Mustache模板的默认的文件扩展名是.html。现在.mustache成了官方指定的扩展名,而且很多的IDE插件已经支持了此后缀。你可以通过spring.mustache.suffix来覆盖现在的默认的支持。
@WebFluxTest支持
Reactive controller现在可以使用@WebFluxTest来测试。它提供的功能和 @WebMvcTest类似。而且WebTestClient可以直接使用,已经被自动配置(auto-configured)了。
使用@SpringBootTest进行WebTestClient自动配置
将@SpringBootTest用于实际服务器(即DEFINED_PORT或RANDOM_PORT)时,WebTestClient的可用方式与TestRestTemplate相同。
/loggers端点POST的状态码改变
针对/loggers端点上POST操作的状态码已又200改为204。
Elasticsearch
Elasticsearch已升级到5.4+。 与Elastic公司宣布不再支持嵌入式Elasticsearch的情况一样,NodeClient的自动配置已被删除。就是这么的节奏一致。现在你可以通过使用spring.data.elasticsearch.cluster-nodes自动配置TransportClient,具体value可以是一个或多个要连接的节点的地址。
Spring Data Web配置
Spring Boot公开了一个新的spring.data.web配置名称空间,可以轻松配置分页和排序。
Thymeleaf starter
Thymeleaf starter现在包含了thymeleaf-extras-java8time,开箱即用。
@DataRedisTest
新加了一个测试的时候针对redis的新注解。
Cassandra
spring.data.cassandra 现在支持池化(pooling)。
Kafka listener支持批量消费
现在支持一次性批量消费多个ConsumerRecord,可以创建一批的监听器(listener),这样设置:spring.kafka.listener.type=batch
Web filters 初始化
Web filters 现在在所有支持的容器中都会被立刻初始化。
Auto-configuration 报告
现在不满足条件(unconditional)的class也会被包含进来,在自动配置(auto-configuration)的Actuator端点的response中一并返回。
重置logger操作
现在Loggers端点(endpoint) 支持reset日志级别到默认设置。
Maven 插件属性
插件的配置属性现在的暴露方式有所改变,现在所有的都是以spring-boot为前缀,这是为了避免和其他插件冲突而导致错误。比如,以下命令行可以启用profile foo:
mvn spring-boot:run -Dspring-boot.run.profiles=foo
Devtools 远程调试
已经从Devtools中删除了通过HTTP进行远程调试的支持。(#9489)
Auto-configuration排序
@AutoConfigureOrder 默认值由Ordered.LOWEST_PRECEDENCE变为0。 (#10142)
Auto-configuration测试工具
一个新的ApplicationContextRunner 测试工具让我们测试自动配置变得容易。 未来将会把所有的测试套件都迁移到这个模型上。参考文档:https://docs.spring.io/spring-boot/docs/2.0.x/reference/htmlsingle/#boot-features-test-autoconfig
OAuth 2.0 支持
Spring Security OAuth 项目中的功能被迁移到Spring Security。不再为依赖关系提供依赖管理,Spring Boot 2 通过 Spring Security 5 提供 OAuth 2.0 客户端支持。
如果您依赖尚未迁移的 Spring Security OAuth 功能,则需要在其他 jar 上添加依赖项,
参考文档:
https://docs.spring.io/spring-security-oauth2-boot/docs/current/reference/htmlsingle/
Mockito 1.x
Mockito 1.x不再支持@MockBean和@SpyBean。 如果你不使用spring-boot-starter-test来管理依赖关系,则应升级到Mockito 2.x。
JSON-B 支持
除了Jackson 和 Gson,现在还支持了JSON-B 。JSON测试支持也已更新为新的JsonbTester类。
Spring WebFlux支持错误约定
Spring Boot现在让WebFlux的错误约定和MVC保持一致就像使用MVC一样:默认视图和JSON响应错误,自定义错误视图等等。
TLS 配置 和 HTTP/2 支持
可以为WebFlux应用配置SSL,使用server.ssl.*配置属性。Tomcat, Jetty, Undertow 和 Reactor Netty都支持。可以给MVC 或 WebFlux应用配置HTTP/2:
使用server.http2.enabled
@KafkaListener支持使用@SendTo
使用了自动配置工厂的Kafka listener现在支持@SendTo。
Kotlin扩展
Spring Boot 2.0 发布了Kotlin runApplication扩展:
package com.example.demo
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
@SpringBootApplication
class DemoApplication
fun main(args: Array<String>) {
runApplication<DemoApplication>(*args)
}
Job command line runner 顺序
执行批处理job的CommandLineRunner启动order是0。
支持自动配置的模板化欢迎页
Spring Boot 2.0 现在支持静态和模板化两种欢迎页类型。它会首先去配置好的静态内容的目录下查找index.html文件,如果没找到,然后就去查找index模板。 只要找到了一个就会被用作欢迎页。
Context path会在启动时被打印
在Spring Boot之前的版本中,对context path貌似并没有那么的重视一样。现在当我们使用内嵌容器的时候, context path 会被打印在HTTP 端口的旁边,如下格式:
Tomcat started on port(s): 8080 (http) with context path ‘/foo’
测试优化,自动扫描Converter和GenericConverter
Converter 和 GenericConverter beans现在可以被@WebMvcTest和@WebFluxTest自动扫描到了。
Health vs. Status
status endpoint 已经被删除了,现在改成了health。这个health 端点既可以展示status也可以有更多的细节。 health 端点现在默认是被暴露的(只展示status)。如果你希望展示更多的细节信息,可以通过修改属性management.endpoints.health.show-details来实现:
management.endpoints.health.show-details=always