简单了解Spring Framework5.0新特性
作者:一杯甜酒 发布时间:2021-08-06 02:21:46
SpringFramework5.0是自2013年12月版本4发布之后SpringFramework的第一个主发行版。SpringFramework项目的领导人JuergenHoeller于2016年7月28日宣布了第一个SpringFramework5.0里程碑版本(5.0M1)。
现在,将近一年的时间过去以后,我们期盼已久的RC3版本将于2017年7月18日发行。这是路线图规划中SpringFramework5.0首个GA发行版的最后一次发行。
从高层来看,SpringFramework5.0的功能可以分为:
JDK基线更新
核心框架修正
核心容器更新
含Kotlin在内的函数式编程
响应式编程模型
测试改进
库支持
中止支持
SpringFramework5.0的JDK基线更新
整个Springframework5.0代码库运行于Java8之上。因此SpringFramework5.0对环境的最低要就就是Java8。
这一点实际上对框架而言非常重要。而作为开发者的我们而言,则已经能够去藉此来享受到现代Java发行版中的所有新特性了。而框架版本还背负这支持已经不被建议使用的Java发行版的任务。
现在,框架的最低要求是Java8.
SpringFramework5.0原来是计划在Java9之上发行的。然后,在基于Java9的发行版运作了超过18个月之后,Spring团队决定将SpringFramework5.0发行版同Java9的绑定关系解除。
不过,在Java9发布的时候(计划是2017年9月份),SpringFramework5.0会准备好的。
核心框架修订
核心的SpringFramework5.0已经利用Java8所引入的新特性进行了修订。比较关键的一些如下:
基于Java8的反射增强,SpringFramework5.0中的方法参数可以更加高效的进行访问。
核心的Spring接口现在提供基于Java8的默认方法构建的选择性声明。
用@Nullable和@NotNull注解来显示表明可为空的参数和以及返回值。这样就够在编译的时候处理空值而不是在运行时抛出NullPointerExceptions。
在日志记录方面,SpringFramework5.0带来了CommonsLogging桥接模块的封装,它被叫做spring-jcl而不是标准的CommonsLogging。当然,无需任何额外的桥接,新版本也会对Log4j2.x,SLF4J,JUL(java.util.logging)进行自动检测。
有了Resourse抽象所提供的isFile指示器以及getFile方法,防御式编程方法也得到了框架的推动。
核心容器更新
SpringFramework5.0现在支持候选组件索引作为类路径扫描的替代方案。该功能已经在类路径扫描器中添加,以简化添加候选组件标识的步骤。
应用程序构建任务可以定义当前项目自己的META-INF/spring.components文件。在编译时,源模型是自包含的,JPA实体和Spring组件是已被标记的。
从索引读取实体而不是扫描类路径对于小于200个类的小型项目是没有明显差异。但对大型项目影响较大。加载组件索引开销更低。因此,随着类数的增加,索引读取的启动时间将保持不变。
加载组件索引的耗费是廉价的。因此当类的数量不断增长,加上构建索引的启动时间仍然可以维持一个常数,不过对于组件扫描而言,启动时间则会有明显的增长。
这个对于我们处于大型Spring项目的开发者所意味着的,是应用程序的启动时间将被大大缩减。虽然20或者30秒钟看似没什么,但如果每天要这样登上好几百次,加起来就够你受的了。使用了组件索引的话,就能帮助你每天过的更加高效。
你可以在Spring的Jira上了解更多关于组件索引的相关信息。
@Nullable注解现在也可以被用来作为可选注入项的指示器。@Nullable为对象使用方规定了一项义务,就是它们必须准备以为取值为null的值。在此次发布之前,实现这件事情的唯一方法就是通过Android的Nullable,CheckerFramework的Nullable,以及JSR305的Nullable。
发行说明中的其他一些新功能和增强功能包括:
在GenericApplicationContext和AnnotationConfigApplicationContext中实现函数式编程风格。
对接口方法的事务、缓存和异步注释的一致性检测。
将XML配置命名空间简化为无版本化的模式。
使用Kotlin进行函数式编程
SpringFramework5.0引入了对JetBrainsKotlin语言的支持。Kotlin是一种支持函数式编程编程风格的面向对象语言。Kotlin运行在JVM之上,但运行环境并不限于JVM。
有了对Kotlin的支持,开发者可以进行深度的函数式Spring编程,特别是在函数式Web端点以及Bean注册这些方面。
在SpringFramework5.0中,你可以为WEB的函数式API编写干净且地道的Kotlin代码,就像下面这样:
{
("/movie" and accept(TEXT_HTML)).nest {
GET("/", movieHandler::findAllView)
GET("/{card}", movieHandler::findOneView)
}
("/api/movie" and accept(APPLICATION_JSON)).nest {
GET("/", movieApiHandler::findAll)
GET("/{id}", movieApiHandler::findOne)
}
}
对于 Bean 的注册,作为 XML 或者 @Configuration 以及 @Bean 的替代办法, 现在你可以使用 Kotlin 来注册 Spring Bean了,就像下面这样:
val context = GenericApplicationContext {
registerBean()
registerBean {
Cinema(it.getBean())
}
}
响应式编程模型
此次Spring发行版本的一个激动人心的特性就是新的响应式堆栈WEB框架。这个堆栈完全的响应式且非阻塞,适合于事件循环风格的处理,可以进行少量线程的扩展。
ReactiveStreams是来自于Netflix,Pivotal,Typesafe,RedHat,Oracle,Twitter以及Spray.io的工程师特地开发的一个API。它为响应式编程实现的实现提供一个公共的API,好实现Hibernate的JPA。这里JPA就是这个API,而Hibernate就是实现。
ReactiveStreamsAPI是Java9的官方版本的一部分。在Java8中,你会需要专门引入依赖来使用ReactiveStreamsAPI。
SpringFramework5.0对于流式处理的支持依赖于ProjectReactor来构建,其专门实现了ReactiveStreamsAPI。
SpringFramework5.0拥有一个新的spring-webflux模块,支持响应式HTTP和WebSocket客户端。SpringFramework5.0还提供了对于运行于服务器之上,包含了REST,HTML,以及WebSocket风格交互的响应式网页应用程序的支持。
在spring-webflux中包含了两种独立的服务端编程模型:
基于注解:使用到了@Controller以及SpringMVC的其它一些注解;
使用Java8lambda表达式的函数式风格的路由和处理。
有了SpringWebflux,你现在可以创建出WebClient,它是响应式且非阻塞的,可以作为RestTemplate的一个替代方案。
这里有一个使用Spring5.0的REST端点的WebClient实现:
WebClient webClient = WebClient.create();
Mono person = webClient.get()
.uri("http://localhost:8080/movie/42")
.accept(MediaType.APPLICATION_JSON)
.exchange()
.then(response -> response.bodyToMono(Movie.class));
尽管新的WebFlux模块给我么带来了激动人心的新能力,传统的SpringMVC在SpringFramework5.0仍然得到了完整的支持。
测试方面的提升
SpringFramework5.0完全支持JUnit5Jupiter,所以可以使用JUnit5来编写测试以及扩展。此外还提供了一个编程以及扩展模型,Jupiter子项目提供了一个测试引擎来在Spring上运行基于Jupiter的测试。
另外,SpringFramework5还提供了在SpringTestContextFramework中进行并行测试的扩展。
针对响应式编程模型,spring-test现在还引入了支持SpringWebFlux的WebTestClient集成测试的支持,类似于MockMvc,并不需要一个运行着的服务端。使用一个模拟的请求或者响应,WebTestClient就可以直接绑定到WebFlux服务端设施。
你可以在这里找到这个激动人心的TestContext框架所带来的增强功能的完整列表。
当然,SpringFramework5.0仍然支持我们的老朋友JUnit!在我写这篇文章的时候,JUnit5还只是发展到了GA版本。对于JUnit4,SpringFramework在未来还是要支持一段时间的。
库支持
SpringFramework5.0目前支持以下升级库的版本:
Jackson2.6+
EhCache2.10+/3.0GA
Hibernate5.0+
JDBC4.0+
XmlUnit2.x+
OkHttp3.x+
Netty4.1+
中止的支持
在API层面,SpringFramework5.0不再支持以下包:
beans.factory.access
jdbc.support.nativejdbc
spring-aspects模块的mock.staticmock
web.view.tiles2M.(最低要求Tiles3)
orm.hibernate3和orm.hibernate4.目前Hibernate5是支持的框架。
SpringFramework5.0同时也停止了对以下库的支持:
Portlet.
Velocity.
JasperReports.
XMLBeans.
JDO.
Guava.
如果你正在使用任何上面的包,建议你将SpringFramework版本维持在4.3.x。
结语
SpringFramework5.0的亮点绝对是响应式编程,这是一个重要的范式转变。你可以将SpringFramework5.0作为响应式程序的基础版本。对于2017年及以后的剩余时间里,你可以期待看到子项目实现响应式特性。你将看到即将发布的SpringData、SpringSecurity、SpringIntegration等版本所提供的响应式编程功能。
SpringData团队已经为MongoDB和Redis实现了响应式支持。
使用JDBC获取响应式支持还为时过早。JDBC规范本身就是阻塞的,在传统的JDBC数据库中看到响应式编程的还需要一段时间。
虽然响应式编程是SpringFramework5.0中的闪光点,但它不会在任何地方得到支持。下游技术需要提供响应式支持。
随着响应式编程越来越受欢迎,我们可以期待越来越多的技术将实现响应式解决方案。当然,我们可以期待Spring框架随着其他的响应式编程方案的使用而发展
Spring中利用配置文件和@value注入属性值代码详解
Spring集成Redis详解代码示例
Spring AOP拦截-三种方式实现自动代理详解
如有不足之处,欢迎留言指出。
springframework.jar包 官方免费版
来源:http://blog.csdn.net/u012562943/article/details/77449666
猜你喜欢
- 1、#{}是预编译处理,MyBatis在处理#{ }时,它会将sql中的#{ }替换为?,然后调用PreparedStatement的set
- Springboot导入本地jar后 打包依赖无法加入1.本地jar包2.pom文件添加自定义jar包导入<!--自定义jar--&g
- 一、循环语句的几种语法语法:for循环格式:for(初始化语句;条件判断;递进语句){循环体;}while循环格式:初始化语句;while(
- 前言上文讲的MyBatis部署运行且根据官网运行了一个demo:一步到位部署运行MyBatis3源码<保姆级>jdbc再贴一个J
- 1.问题引出源码: public static void main(String[] args) { List&l
- 一、MVC架构1、MVC是什么MVC是模型Model、视图View和控制器Controller的简称,是一种架构规范降低了业务逻辑与视图之间
- 在windows环境下,我们通常在IDE如VS的工程中开发C++项目,对于生成和使用静态库(*.lib)与动态库(*.dll)可能都已经比较
- 本文实例讲述了Java数组的定义、初始化、及二维数组用法。分享给大家供大家参考,具体如下:数组的定义1.数组是有序数据的集合,数组中的每个元
- 原理解析在开发当中,“断点续传”这种功能很实用和常见,听上去也是比较有“逼格”的感觉。所以通常我们都有兴趣去研究研究这种功能是如何实现的?
- 日期格式化标准 DateTime 格式字符串如果格式字符串只包含下表列出的某个单个格式说明符,则它们被解释为标准格式说明符。如果指定的格式字
- mybatis-plus 查询传入参数Map,返回List<Map>原因有时实体类属性不够用,又不想写自定义VO了,所以用map
- 前言如何下载和使用MyBatis Generator 插件,只说代码,不讲感情。如果有问题还请多多指点。开发环境开发工具:IntelliJ
- 本文实例为大家分享了android绘制曲线和折线图的具体代码,供大家参考,具体内容如下(曲线) (折线)1.CurveView.j
- java中的LIST在删除时,一般会用list.remove(o); 但这样往往会出现问题,先来看下面的这段代码:package com.d
- 在之前,已经学习到了线程的创建和状态控制,但是每个线程之间几乎都没有什么太大的联系。可是有的时候,可能存在多个线程多同一个数据进行操作,这样
- 首先写个单例:public class SingleDemo { private static SingleDemo s =
- 只使用try和finally不使用catch的原因和场景JDK并发工具包中,很多异常处理都使用了如下的结构,如AbstractExecuto
- 之前我们在使用vue进行 h5 表单录入的过程中,遇到了Android软键盘弹出,覆盖 h5页面 输入框 问题,在此进行回顾并分享给大家:系
- 仿Keep运动休息倒计时控件,供大家参考,具体内容如下源码控件本身非常非常简单,唯一难点在于倒计时期间动态增减时长,如果说动态增减时长是瞬间
- 在我们使用mybatis plus 时, mybatis plus 可以帮我们自动封装我们的实体类用来查询添加,当我们遇见我们的尸体类名与我