Spring Framework 5.0是自2013年12月发布版本4以来Spring框架的第一个主要版本。Spring框架项目负责人juergenhoeller于2016年7月28日宣布发布了第一个Spring框架5.0里程碑(5.0m1)。
我对Spring Framework 5.0中的新特性和增强感到兴奋。
在较高的层次上,Spring Framework 5.0的功能可以分为:
- JDK基线更新。
- 核心框架修订。
- 核心容器更新。
- 用Kotlin进行函数式编程。
- 反应式规划模型。
- 测试改进。
- 图书馆支持。
- 停止支持。
Spring Framework 5.0的JDK基线更新
整个springframework5.0codebase运行在java8上。因此,Java8是在SpringFramework5.0上工作的最低要求。
这实际上对框架非常重要。作为开发人员,我们能够享受现代Java版本中的所有新特性。框架本身在支持不推荐使用的Java版本方面背负了很多包袱。
最初,springframework5.0预计将在java9上发布。然而,由于Java9发行版运行了18个多月,Spring团队决定将SpringFramework5.0版本与Java9分离。
然而,当Java9发布(预计在2017年9月发布)时,SpringFramework5.0将准备就绪。
核心框架修订
核心springframework5.0已经过修改,以利用java8中引入的新特性。关键是:
- 基于Java8反射增强,可以有效地访问SpringFramework5.0中的方法参数。
- 核心Spring接口现在提供了基于java8默认方法构建的选择性声明。
@Nullable
和@NotNull
注释将显式标记可为null的参数和返回值。这允许在编译时处理空值,而不是在运行时抛出NullPointerException。
在日志方面,springframework5.0提供了Commons日志桥接模块,名为springjcl
,而不是标准的Commons日志。另外,这个新版本将自动检测Log4j 2.x、SLF4J、JUL(java.util.logging),而不需要任何额外的网桥。
防御性编程也受到了资源抽象的推动,它为getFile方法提供了isFile
指示符。
核心容器更新
springframework5.0现在支持候选组件索引作为类路径扫描的替代。此支持已添加到类路径扫描程序中的候选组件标识步骤中。
应用程序生成任务可以为当前项目定义自己的META-INF/spring.components
文件。在编译时,源模型被内省,JPA实体和Spring组件被标记。
对于少于200个类的小项目,从索引中读取实体而不是扫描类路径并没有显著差异。然而,它对大型项目有重大影响。加载组件索引很便宜。因此,随着类数的增加,索引的启动时间保持不变。
这对我们开发人员意味着,在大型Spring项目上,我们的应用程序的启动时间将大大缩短。虽然20秒或30秒看起来并不多,但当你一天要等那么多时间几十次或几百次的时候,就加起来了。使用组件索引将有助于提高您的日常工作效率。
您可以在Spring的Jira上找到关于组件索引特性的更多信息。
现在,@Nullable
注释还可以用作可选注入点的指示符。使用@Nullable
使消费者承担了一项义务,即他们必须为值为null做好准备。在此版本之前,实现这一点的唯一方法是通过Android的Nullable、Checker Framework的Nullable和jsr305的Nullable。
发行说明中的其他一些新功能和增强功能包括:
- 在
GenericaApplicationContext
和AnnotationConfigApplicationContext
中实现函数式编程风格。 - 对接口方法上的事务、缓存和异步注释的一致检测。
- XML配置名称空间朝着未版本化的模式进行了优化。
用Kotlin进行函数式编程
springframework5.0引入了对JetBrains-Kotlin语言的支持。Kotlin是一种支持函数式编程风格的面向对象语言。Kotlin运行在JVM之上,但不限于此。
有了Kotlin支持,开发人员可以深入到函数式Spring编程中,特别是对于函数式Web端点和bean注册。
在Spring Framework 5.0中,您可以为Web functional 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框架。由于它是完全反应的、非阻塞的,所以它适合于事件循环样式的处理,可以用少量线程进行扩展。
Reactive Streams是由Netflix、Pivotal、Typesafe、Red Hat、Oracle、Twitter和Spray.io的工程师开发的API规范。这为要实现的反应式编程实现提供了一个公共API,很像JPA for Hibernate,其中JPA是API,Hibernate是实现。
reactivestreamsapi正式成为java9的一部分。在Java8中,您将需要为reactivestreamsAPI规范包含一个依赖项。
springframework5.0中的流支持是建立在project reactor之上的,projectreactor实现了reactivestreamsapi规范。
springframework5.0有一个新的springwebflux模块,它支持反应式HTTP和WebSocket客户端。springframework5.0还支持在服务器上运行的反应式web应用程序,这些服务器包括REST、HTML和WebSocket样式的交互。
在SpringWebFlux中,服务器端有两种不同的编程模型:
- 基于
@Controller
的注解和springmvc的其它注解。 - 使用java8 lambda进行功能风格的路由和处理。
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的测试。
此外,springframeworkfive还支持springtestcontext
框架中的并行测试执行。
对于反应式编程模型,springtest现在包括WebTestClient,用于集成对springwebflux的测试支持。与MockMvc类似的新WebTestClient不需要运行的服务器。使用模拟请求和响应,WebTestClient可以直接绑定到WebFlux服务器基础结构。
当然,springframework5.0仍然支持我们的老朋友junit4!在撰写本文时,JUnit5即将上市,对JUnit4的支持将在未来的一段时间内与Spring框架配合使用。
库支持
Spring Framework 5.0现在支持以下升级的库版本:
- Jackson2.6+
- EhCache 2.10+/3.0加仑
- Hibernate5.0+
- JDBC 4.0版+
- XML单元2.x+
- OkHttp 3.x+
- Netty4.1+
中止支持
在API级别,Spring Framework 5.0已停止支持以下包:
- beans.factory.access访问
- jdbc.support.nativejdbc
- springaspects模块的mock.staticmock。
- web.view.tiles2M。现在Tiles3是最低要求。
- orm.hibernate3和orm.hibernate4。现在,hibernate5是受支持的框架
Spring Framework 5.0还停止了对以下库的支持:
- Portlet。
- Velocity。
- JasperReports。
- XMLBeans。
- JDO。
- Guava。
如果您使用的是上述任何软件包,建议您继续使用SpringFramework 4.3.x。
小结
Spring Framework 5.0的亮点无疑是反应式编程,这是一个重大的范式转变。您可以将Spring Framework 5.0看作是反应程序的基础版本。在2017年及以后的时间里,您可以看到子项目实现了反应式特性。您将看到Spring数据、Spring安全性、Spring集成等即将发布的版本中添加了响应式编程特性。
Spring数据团队已经实现了对MongoDB和Redis的响应式支持。
现在用JDBC获得反应式支持还为时过早。JDBC规范本身是阻塞的。所以,我们还需要一段时间才能看到传统JDBC数据库的反应式编程。
除特别注明外,本站所有文章均为老K的Java博客原创,转载请注明出处来自https://javakk.com/1893.html
暂无评论