Spring 5于2017年9月发布了通用版本,它是自2013年12月以来第一 个主要的Spring版本。它提供了一些人们期待已久的改进,还采用了一种全新的编程范例,以反应式原则为基础。
这个版本是很长时间以来最令人激动的版本。Spring 5兼容JavaTM8 和JDK 9,它集成了反应式流,以方便后续提供一种颠覆性方法来实现 端点和Web应用程序开发。
当然,反应式编程不仅是此版本的主题,还是令许多程序员激动不 已的重大特性。譬如Spring 5很好地满足了针对负载波动进行无缝扩展的容灾和响应式服务的需求。
以下将介绍spring5带来的特性和改变。它将包含以下关键内容:
- JDK 基线和库更新、支持
- 使用JDK8和JDK9新特性
- 反应式编程模型
- 含 Kotlin 在内的函数式编程
- 测试改进和提升
- spring核心迭代和一般性修订
- 中止支持
一、JDK 基线和库更新、支持
要构建和运行 Spring5 应用程序,我们至少需要 J2EE7 和 JDK8。以前的 JDK 和 JavaEE 版本将不再支持。而目前比较JDK稳定的8版本将是最基础的Java开发环境。所以J2EE7包含的这些内容版本不容小觑:
- Servlet 3.1
- JMS 2.0
- JPA 2.1
- JAX-RS 2.0
- Bean Validation 1.1
各类服务器的最低使用版本:
- Tomcat 8.5+
- Jetty 9.4+
- WildFly 10+
- Netty 4.1+
- Undertow 1.4+
同样Spring Framework 5.0目前支持以下升级库的版本 :
- Jackson 2.6+
- EhCache 2.10+ / 3.0 GA
- Hibernate 5.0+
- JDBC 4.0+
- XmlUnit 2.x+
- OkHttp 3.x+
- Netty 4.1+
二、使用JDK8和JDK9新特性
Spring5 的基准版本为8,因此它使用了 Java8 和9的许多新特性。例如:
A、Spring 接口中的默认方法(JDK9);
B、基于 Java8 反射增强的内部代码改进(JDK8);
C、在框架代码中使用函数式编程 - lambda表达式 和 stream流(JDK8);
D、支持HTTP/2(JDK9)。以下将针对JDK版本内容解释说明。
HTTP/2方面的支持
HTTP/2提高了传输性能,减少了延迟并提高了应用程序的吞吐量从而提供了丰富的Web体验。Spring 5提供专门的HTTP/2特性支持(由Tomcat 9.0、Jetty 9.3 和Undertow 1.4提供)。
Lambda表达式注册Bean实例
传统注册bean使用XML配置或者javaConfig进行实例,但是这些在5.0后也有新方案,我们可以使用Lambda表达式进行bean的实例处理:
context.registerBean(TestBean.class, () -> new
TestBean(context.getBean(Test.class))
);
三、反应式编程模型
Spring 5 Framework 基于一种反应式基础而构建,而且是完全异步和非阻塞的。只需少量的线程,新的事件循环执行模型就可以垂直扩展。
该框架采用反应式流来提供在反应式组件中传播负压的机制。负压是一个确保来自多个生产者的数据不会让使用者不堪重负的概念。
Spring WebFlux 是 Spring 5 的反应式核心,它为开发人员提供了两种为 Spring Web 编程而设计的编程模型:一种基于注解的模型和 Functional Web Framework (WebFlux.fn)。
基于注解的模型是 Spring WebMVC 的现代替代方案,该模型基于反应式基础而构建,而 Functional Web Framework 是基于 @Controller 注解的编程模型的替代方案。这些模型都通过同一种反应式基础来运行,后者调整非阻塞 HTTP 来适应反应式流 API。
四、含 Kotlin 在内的函数式编程
Kotlin 是一种静态类型的JVM语言,它让代码具有表现力,简洁性和可读性。 Spring5.0 对 Kotlin 有很好的支持。
函数式编程
Spring5 还提供了一个函数式Web框架。它提供了使用函数式编程风格来定义端点的特性。 该框架引入了两个基本组件:HandlerFunction 和 RouterFunction。
HandlerFunction 表示处理接收到的请求并生成响应的函数。
RouterFunction 替代了 @RequestMapping 注解。它用于将接收到的请求路由到处理函数。如:
RouterFunction<String> route = route(GET("/hello-world"),request -> Response.ok().body(fromObject("Hello World")));
五、测试改进和提升
Spring Framework 5.0 完全支持 JUnit 5 Jupiter,所以可以使用 JUnit 5 来编写测试以及扩展。此外还提供了一个编程以及扩展模型,Jupiter 子项目提供了一个测试引擎来在 Spring 上运行基于 Jupiter 的测试。当然在5.0版本使用旧版的JUnit 4.0也是可以的。
class Demo {
@Test
public void should_get_message_and_data() {
Result<String> result = new Result<>(1, "msg");
Assertions.assertEquals(1, result.getCode());
Assertions.assertEquals("msg", result.getMsg());
}
}
在JDK8基础上使用函数式编程编程特性:
@Test
public void test_model() {
assertrue(Stream.of(20,50,60).stream().mapToInt(i - > i).sum() >110,() ->">=100")
}
另外,Spring Framework 5 还提供了在 Spring TestContext Framework 中进行并行测试的扩展。
spring-test 也引入了支持 Spring WebFlux 的 WebTestClient ,为集成测试提供支持。WebTestClient使用模拟请求和响应 来避免耗尽服务器资源,并能直接绑定到WebFlux服务器的基础架构。它可绑定到真实的服务器,或者使用控制器或函数。
六、spring核心一般迭代
A、Spring 5改进了扫描和识别组件的方法,使大型项目的性能得到提 升。目前扫描是在编译时执行的,而且向 META-INF/spring.components 文件中的索引文件添加了组件坐标。该索引是通过一个为项目定义的特定于平台的应用程序构建任务来生成;
B、spring5添加了对@Nullable的支持,后者可用于指示可选的注入 点。使用者现在必须准备接受null值。此外,还可以使用此注解来标记 可以为null的参数、字段和返回值;
C 、Spring Logging 还提升了性能,自带开箱即用的 Commons Logging 桥接器
七、中止的支持
随着 Java、JavaEE 和其他一些框架基准版本的增加,SpringFramework5 取消了对几个框架的支持。例如:
- Portlet
- Velocity
- JasperReports
- XMLBeans
- JDO
- Guava
- Hibernate3、4
一些包也被清理掉:
beans.factory.access、jdbc.support.nativejdbc、mock.staticmock(来自 spring-aspects模块)或web.view.tiles2M
我们在升级使用的时候也将要看到哪些不兼容,对号入座。
总结:
Spring5更新首要特性是新的反应式编程模型,这代表着对提供可无缝扩展、基于 Spring 的响应式服务的重大保障。随着大家对 Spring 5 的采用,开发人员有望看到反应式编程将会成为使用 Java 语言的 Web 和企业应用程序开发的未来发展道路。
码字不易,如果你也喜欢,不妨留下脚印~
本文暂时没有评论,来添加一个吧(●'◡'●)