本文将全面介绍Spring 5。我将通过Kotlin介绍Java SE 8和Java EE 7 API的基准升级,Spring 5新的反应式编程模型,HTTP/2支持,Spring对函数式编程的全面支持。
前面:对于很多开发者来说,大部分还在用spring4,spring5早就发布了。虽然你可能还没有用过spring5,但是你还是需要对它有一个大概的了解。
Spring 5在2017年9月发布了通用版(GA),这标志着自2013年12月以来第一个主要的Spring框架版本。它提供了一些期待已久的改进,并且还采用了一种全新的编程范式,该范式基于reactive声明中陈述的reactive原则。
这个版本是很长一段时间以来Spring Framework最激动人心的版本。spring兼容Java吗?8和JDK 9,它集成了反应式流程,为端点和Web应用程序开发提供了一种突破性的方法。
不可否认,反应式编程不仅是这个版本的主题,也是一个让许多开发人员兴奋的重要特性。人们对可无缝扩展以应对负载波动的灾难恢复和响应服务的需求日益增加,Spring 5很好地满足了这一需求。
我还会简单介绍一下测试和性能增强,最后介绍一下Spring core和container的通用改版。
升级到 Java SE 8 和 Java EE 7
到现在为止,Spring Framework仍然支持一些废弃的Java版本,但是Spring 5已经从旧的包袱中解放出来了。为了充分利用Java 8的特性,对其代码库进行了改进,框架要求Java 8为最低JDK版本。
Spring 5在类路径(和模块路径)上完全兼容Java 9,并且通过了JDK 9测试套件的测试。这对Java 9爱好者来说是个好消息,因为Spring可以在Java 9发布后立即使用它。
在API层面,Spring 5兼容Java EE 8技术,满足Servlet 4.0、Bean Validation 2.0和新的JSON绑定API的要求。Java EE API的最低要求是V7,它引入了Servlet、JPA和Bean验证API的次要版本。
反应式编程模型
Spring 5最令人兴奋的新特性是它的反应式编程模型。Spring框架是建立在反应式基础上的,它是完全异步和非阻塞的。只需几个线程,新的事件循环执行模型就可以垂直扩展。
该框架采用反应流来提供在反应部件中传播负压的机制。负压力是一个概念,以确保来自多个生产者的数据不会淹没用户。
Spring WebFlux是Spring 5的反应式核心,它为开发者提供了两种专为Spring Web编程设计的编程模型:基于注释的模型和功能性Web框架(webflux.fn)。
基于注释的模型是Spring WebMVC的现代替代方案,它建立在反应的基础上,而功能Web框架是基于@Controller注释的编程模型的替代方案。这些模型都运行在相同的反应式基础上,后者调整非阻塞HTTP以适应反应式流API。
使用注解进行编程
WebMVC程序员应该熟悉Spring 5的基于注释的编程模型。Spring调整了WebMVC的@Controller编程模型,采用了同样的注释。
在清单1中,BookController类提供了两个方法,一个是响应对图书列表的HTTP请求,另一个是响应对具有给定id的图书的HTTP请求。注意由资源方法返回的对象(Mono和Flux)。这些对象是实现反应式流规范中的发布者接口的反应式类型。他们的职责是处理数据流。Mono对象处理只有一个元素的流,而Flux表示有n个元素的流。
1.列表:反应式控制器
@RestController
公共类BookController {
@GetMapping(/book )
FluxBook list() {
返回this . repository . find all();
}
@GetMapping(/book/{id} )
mono book find byid(@ path variable String id){
返回this . repository . findone(id);
}
//为简洁起见,省略了管道代码
}
这是对Spring Web编程的注释。现在我们使用功能性Web框架来解决同样的问题。
函数式编程
Spring 5的新函数方法将请求委托给处理函数,处理函数接受服务器请求实例并返回一个反应类型。清单2演示了这个过程,其中listBook和getBook方法类似于清单1中的函数。
清单2 .清单2。BookHandler函数类
公共类BookHandler {
公共mono server响应列表簿(ServerRequest请求){
返回ServerResponse.ok()。内容类型(应用程序_JSON)。body(repository.allPeople()、book . class);
}
公共mono server response getBook(server request请求){
返回repository . getbook(request . path variable( id ))。然后(book - ServerResponse.ok()。内容类型(应用程序_JSON)。正文(fromObject(book)))。otherwiseiftempty(server response . not found()。build());
}
//为简洁起见,省略了管道代码
}
通过路由功能将HTTP请求谓词与媒体类型进行匹配,并将客户端请求路由到处理功能。清单3显示图书资源端点URI将调用委托给适当的处理程序:
清单3。路由器功能
book handler handler=new book handler();
路由器功能服务器响应人员路由=
路线(
GET(/books/{id} )。和(accept(APPLICATION_JSON)),handler:getBook)。安卓系统(
GET(/books )。和(accept(APPLICATION_JSON)),handler:list books);
这些例子背后的数据仓库也支持完整的反应式体验,这是通过Spring Data对反应式Couchbase、反应式MongoDB和Cassandra的支持来实现的。
使用 REST 端点执行反应式编程
新的编程模型脱离了传统的Spring WebMVC模型,并引入了一些不错的新特性。
例如,WebFlux模块提供了RestTemplate的完全非阻塞和反应式替代方案,名为WebClient。清单4创建了一个WebClient,并调用books端点来请求一本给定id为1234的书。
清单4。通过WebClient调用REST端点
mono book book=webclient . create( http://localhost:8080 )。获取()。url(/books/{id} ,1234)。接受(应用程序_JSON)。交换(请求)。然后(response-response . body tomono(book . class));
HTTP/2 支持
HTTP/2的幕后原理:要了解HTTP/2如何提高传输性能、减少延迟并帮助提高应用程序吞吐量,从而提供改进的丰富Web体验,请参考我关于这一期待已久的升级的文章。
Spring Framework 5.0将提供特殊的HTTP/2特性支持,还支持人们期望在JDK 9中出现的新HTTP客户端。虽然HTTP/2的服务器推送功能早就通过Jetty servlet引擎的ServerPushFilter类向Spring开发者公开了,但如果发现在Spring 5中开箱即用地提供了HTTP/2的性能增强,Web优化人员肯定会为之欢呼。
EE servlet规范预计2017年第四季度发布,Spring 5.1将提供Servlet 4.0支持。在此之前,HTTP/2特性将由Tomcat 9.0、Jetty 9.3和Undertow 1.4原生提供。
Kotlin 和 Spring WebFlux
Kotlin是JetBrains的面向对象语言,支持函数式编程。它的主要优势之一是与Java的高度互操作性。通过引入对Kotlin的特殊支持,Spring在V5中充分吸收了这一优势。它的函数式编程风格与Spring WebFlux模块完美匹配,它的新路由DSL利用了函数式Web框架和干净且语言友好的代码。端点路由可以简单地表示为清单5所示:
清单5。Kotlin定义端点的路由DSL
@Bean
fun apiRouter()=路由器{
(接受(APPLICATION_JSON)和/api )。巢
/book 。巢
GET(/,bookHandler:findAll)
GET(/{id} ,bookHandler:findOne)
}
/视频。巢
GET(/,videoHandler:findAll)
GET(/{genre} ,videoHandler:findByGenre)
}
}
}
在使用Kotlin 1.1.4时,还增加了对Kotlin的不可变类(通过带有默认值的可选参数)和完全支持null的API的支持。
使用 Lambda 表达式注册 bean
作为传统XML和JavaConfig的替代,现在可以用lambda表达式注册Spring bean,这样bean就可以实际注册为提供者。清单6使用lambda表达式注册一个Book bean。
清单6。将Bean注册为提供者
GenericApplicationContext context=new GenericApplicationContext();
context . register bean(book . class,()- new
book(context . get bean(author . class))
);
Spring WebMVC 支持最新的 API
新的WebFlux模块提供了许多令人兴奋的新功能,但Spring 5也迎合了那些愿意继续使用Spring MVC的开发者的需求。模型-视图-控制器框架在Spring 5中进行了更新,以兼容WebFlux以及最新版本的Jackson 2.9和Protobuf 3.0,甚至包括对新的Java EE 8 JSON-Binding API的支持。
除了HTTP/2特性的基本服务器实现,Spring WebMVC还通过MVC控制器方法的一个参数支持Servlet 4.0的推建器。最后,WebMVC完全支持Reactor 3.1的Flux和Mono对象,以及RxJava1.3和2.1,它们被视为来自MVC控制器方法的返回值。这种支持的最终目标是支持Spring Data中新的反应式WebClient和反应式存储库。
使用 JUnit 5 执行条件和并发测试
JUnit和Spring 5:Spring 5完全接受功能范式,并支持JUnit 5及其新的功能测试风格。还提供了与JUnit 4的向后兼容性,以确保旧代码不会被破坏。
Spring 5的测试套件在很多方面都得到了增强,但最明显的是它对JUnit 5的支持。现在,您可以在单元测试中利用Java 8提供的函数式编程特性。清单7演示了这种支持:
清单7。清单7。JUnit 5完全接受Java 8流和lambda表达式。
@测试
void givenStreamOfInts _ SumShouldBeMoreThanFive(){
assertTrue(Stream.of(20,40,50)。流()。地图输入。sum() 110,()--合计应该大于100 );
}
迁移到JUnit 5:如果您对升级到JUnit 5犹豫不决,史蒂夫佩里的两部分深入分析教程将说服您冒这个险。
Spring 5继承了JUnit 5在Spring TestContext框架内实现多个扩展API的灵活性。例如,开发人员可以通过使用JUnit 5条件测试执行注释@EnabledIf和@DisabledIf来自动计算一个SpEL (Spring Expression Language)表达式,并适当地启用或禁用测试。有了这些注释,Spring 5支持以前难以实现的复杂条件测试方案。Spring TextContext框架现在能够并发执行测试。
使用 Spring WebFlux 执行集成测试
Spring Test现在包含了一个WebTestClient,它支持Spring WebFlux服务器端点的集成测试。WebTestClient使用模拟的请求和响应来避免耗尽服务器资源,并且可以直接绑定到WebFlux服务器基础设施。
WebTestClient可以绑定到一个真实的服务器,或者使用一个控制器或函数。在清单8中,WebTestClient被绑定到localhost:
列出绑定到本地主机的WebTestClient
WebTestClient test client=WebTestClient。bindToServer()。baseUrl(http://localhost:8080 )。build();
在清单9中,测试了RouterFunction:
清单9。将WebTestClient绑定到RouterFunction
router function book router=router functions . route(request谓词。GET(/books ),
request - ServerResponse.ok()。构建()
);
WebTestClient。bindToRouterFunction(book router)。构建()。获取()。uri(/books )。交换()。expectStatus()。伊索克()。expectBody()。isEmpty();
包清理和弃用
Spring 5停止支持一些过时的API。Hibernate 3和4也遭遇了这种厄运,它们被放弃支持Hibernate 5。此外,对Portlet、Velocity、JasperReports、XMLBeans、JDO和Guava的支持已经停止。
包级别的清理继续进行:beans.factory.access、jdbc.support.nativejdbc、mock.staticmock(来自spring-aspects模块)或web.view.tiles2M不再受Spring 5支持。Tiles 3现在是Spring的最低要求。
对 Spring 核心和容器的一般更新
Spring Framework 5改进了扫描和识别组件的方法,从而提高了大型项目的性能。目前在编译时进行扫描,在META-INF/spring.components文件中的索引文件中加入组件坐标。该索引由为项目定义的特定于平台的应用程序构建任务生成。
javax包中用注释标记的组件将被添加到索引中,任何用@Index标记的类或接口都将被添加到索引中。Spring的传统类路径扫描方法并没有被删除,而是作为备份选项保留下来。大型代码库有许多明显的性能优势,托管许多Spring项目的服务器也会缩短启动时间。
Spring 5还增加了对@Nullable的支持,它可以用来指示可选的注入点。用户现在必须准备好接受空值。此外,您可以将此注释置空,以标记可为空的参数、字段和返回值。@Nullable主要用在IntelliJ IDEA等ide中,但也可以用在Eclipse和FindBugs中。这使得在编译时处理空值更加方便,而无需在运行时发送NullPointerExceptions。
Spring日志记录也提高了性能,并且自带了Commons Logging bridge。现在通过资源抽象支持防御性编程,为getFile访问提供了一个文件指示器。
结束语
Spring 5的第一个特性是新的反应式编程模型,这是基于Spring提供无缝扩展和响应服务的重要保证。随着Spring 5的采用,开发人员有望看到反应式编程将成为使用Java语言开发Web和企业应用程序的未来发展道路。
Spring Framework的未来版本将继续反映这一承诺,因为Spring安全性、Spring数据和Spring集成有望采用反应式编程的特性和优势。
总之,Spring 5代表了一种深受Spring开发者欢迎的范式转变,也为其他框架指明了一条开发之路。
以上是全面介绍spring5新特性的详细内容。更多关于spring5新特性的信息,请关注我们的其他相关文章!