简单了解Spring Framework5.0新特性
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 framework5.0新特性的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:
如有不足之处,欢迎留言指出。