SpringBoot2.0新特新及代码变化

SpringBoot 2.0 引入了众多新特性,包括支持 Java 8 和 Java 9,改进的自动配置报告,增强了的 Actuator 功能,以及对反应式编程的支持。新版本对第三方库进行了升级,如 Spring Framework 5,同时对内嵌容器、starter 的传递依赖和 Servlet-specific 的 server properties 进行了调整。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以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改进

  1. SpringBoot2.0对actuator endpointbs进行了改进,默认不再暴露过多的信息,可以通过属性management.endpoints.web.exposure.include设置。
  2. 许多端点现在都有更准确地反映底层数据的JSON,参考文档:

https://docs.spring.io/spring-boot/docs/2.0.x/actuator-api/html/

  1. 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缓存及驱动变化

  1. 现在可以使用spring.cache.redis.*属性配置Redis的缓存默认值。增加了redis缓存存活时间属性spring.cache.redis.time-to-live,SpringBoot2.0 之前没有该功能。
  2. 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值