前言:
最近,有一个小伙伴成功获得好几份不错的offer,和他交谈的过程中得知面试官问他关于Spring的问题比较多,其中最让面试官满意的就是自己回答关于Spring 5的知识点回答的不错。
Spring5于2017年9月发布了通用版本,它是自2013年12月以来第一个主要的Spring版本。它提供了一些人们期待已久的改进,还采用了一种全新的编程范例,以反应式原则为基础。
这个版本是很长时间以来最令人激动的版本。Spring 5兼容Java™8和JDK 9,它集成了反应式流,以方便后续提供一种颠覆性方法来实现端点和Web应用程序开发。
当然,反应式编程不仅是此版本的主题,还是令许多程序员激动不已的重大特性。人们对能够针对负载波动进行无缝扩展的容灾和响应式服务的需求在不断增加,Spring 5很好地满足了这一需求。
和小伙伴的交谈中,他讲述了自己怎么向面试官回答Spring5新特性方面的问题,我也进行了总结,下面分享给大家:
一:升级到Java SE 8和Java EE 7:
以前的Spring一直在支持一些弃用的Java版本,而Spring 5已从“旧包袱”中解放出来。为了充分利用Java 8的特性,它的代码库已进行了改进,而且要求将Java 8作为最低的JDK版本。
Spring 5在类路径(和模块路径)上完全兼容Java 9,而且它通过了JDK 9测试套件的测试。对Java 9爱好者而言,这是一个好消息。
在API级别上,Spring 5兼容Java EE 8技术,满足对Servlet 4.0、Bean Validation 2.0和全新的JSON Binding API的需求。对Java EE API的最低要求为V7,该版本引入了针对Servlet、JPA和Bean Validation API的次要版本。
二:反应式编程模型:
Spring 5最令人兴奋的新特性是它的反应式编程模型。Spring 5基于一种反应式基础而构建,而且是完全异步和非阻塞的。只需少量的线程,新的事件循环执行模型就可以垂直扩展。
Spring 5采用反应式流来提供在反应式组件中传播负压的机制。负压是一个确保来自多个生产者的数据不会让使用者不堪重负的概念。
Spring WebFlux是Spring 5的反应式核心,它为开发人员提供了两种为Spring Web编程而设计的编程模型:基于注解的模型和Functional WebFramework(WebFlux.fn)。
基于注解的模型是Spring Web MVC的现代替代方案,该模型基于反应式基础而构建,而Functional Web Framework是基于@Controller注解的编程模型的替代方案。这些模型都通过同一种反应式规则来运行,后者调整非阻塞HTTP来适应反应式流API。
三:使用注解进行编程:
Web MVC程序员应该对Spring 5的基于注解的编程模型非常熟悉,Spring 5调整了Web MVC的@Controller编程模型,采用了相同的注解。
在下面的代码中BookController类提供了两个方法,分别响应针对某个图书列表的HTTP请求,以及针对具有给定id的图书的HTTP请求。请注意Mono和Flux等对象。这些对象是实现反应式流规范中的Publisher接口的反应式类型,它们的职责是处理数据流。Mono对象处理一个仅含1个元素的流,而Flux表示一个包含N个元素的流。
四:包清理和弃用:
Spring5终止了对一些过时API的支持。遭此厄运的有Hibernate 3和Hibernate 4,为了支持Hibernate 5,它们遭到了弃用。另外,对Portlet、Velocity、JasperReports、XMLBeans、JDO和Guava的支持也已终止。
包级别上的清理工作仍在继续。Spring 5不再支持beans.factory.access、jdbc.support.nativejdbc、mock.staticmock(来自spring-aspects模块)或web.view.tiles2M。Tiles 3现在是Spring的最低要求。
五:Spring核心和容器的一般更新:
Spring 5改进了扫描和识别组件的方法,使大型项目的性能得到提升。目前,扫描是在编译时执行的,而且向META-INF/spring.components文件中的索引文件添加了组件坐标。该索引是通过一个为项目定义的特定于平台的应用程序构建任务来生成的。
标有来自javax包的注解的组件会添加到索引中,任何带@Index注解的类或接口都会添加到索引中。Spring的传统类路径扫描方式没有被删除,而是保留下来作为一种后备选择。有许多针对大型代码库的明显性能优势,托管许多Spring项目的服务器也会缩短启动时间。
Spring 5还添加了对@Nullable的支持,后者可用于指示可选的注入点。使用者现在必须准备接受null值。此外,还可以使用此注解来标记可以为null的参数、字段和返回值。@Nullable主要用于IntelliJ IDEA等IDE,但也可用于Eclipse和FindBugs,它使得在编译时处理null值变得更方便,无须在运行时发送NullPointerExceptions。
Spring Logging还提升了性能,自带开箱即用的Commons Logging桥接器。现在已通过资源抽象支持防御性编程,为getFile访问提供了isFile指示器。
总结:
Spring 5的首要特性是新的反应式编程模型,这代表着对提供可无缝扩展、基于Spring的响应式服务的重大保障。随着人们对Spring 5的采用,反应式编程有望成为使用Java语言的Web和企业应用程序开发的未来。
未来的Spring将继续体现这一承诺,因为SpringSecurity、Spring Data和Spring Integration有望采用反应式编程的特征和优势。
总之,Spring 5代表着一次大受Spring开发人员欢迎的华丽转变,同时也为其他框架指出了一条发展之路。Spring 5的升级也为Spring Boot、Spring Cloud提供了非常丰富的经验,Spring不只是一个框架,已然成了一个编程生态。