Welcome 微信登录

首页 / 软件开发 / JAVA / Spring MVC与JAX-RS比较与分析

Spring MVC与JAX-RS比较与分析2011-10-22 infoq 译:张龙导言

过去几年,REST逐渐成为影响Web框架、Web协议与Web应用设计的重要概念。

现在有越来越多的公司希望能以简单而又贴合Web架构本身的方式公开Web API,因此REST变得越来越 重要也就不足为奇了。使用Ajax进行通信的富浏览器端也在朝这个目标不断迈进。这个架构原则提升了万 维网的可伸缩性,无论何种应用都能从该原则中受益无穷。

JAX-RS(JSR 311)指的是Java API for RESTful Web Services,Roy Fielding也参与了JAX-RS的制 订,他在自己的博士论文中定义了REST。对于那些想要构建RESTful Web Services的开发者来说,JAX-RS 给出了不同于JAX-WS(JSR-224)的另一种解决方案。目前共有4种JAX-RS实现,所有这些实现都支持 Spring,Jersey则是JAX-RS的参考实现,也是本文所用的实现。

如果你使用Spring进行开发,那可能想知道(或者有人曾问过你)Spring MVC与JAX-RS有何异同点? 更进一步,如果你手头有一个Spring MVC应用,使用了控制类继承(SimpleFormController等),你可能 还意识不到现在的Spring MVC对REST广泛的支持。

本文将介绍Spring 3中的REST特性并与JAX-RS进行对比,希望能帮助你理顺这两种编程模型之间的异 同点。

开始前,有必要指出JAX-RS的目标是Web Services开发(这与HTML Web应用不同)而Spring MVC的目 标则是Web应用开发。Spring 3为Web应用与Web Services增加了广泛的REST支持,但本文则关注于与Web Services开发相关的特性。我觉得这种方式更有助于在JAX-RS的上下文中讨论Spring MVC。

要说明的第二点是我们将要讨论的REST特性是Spring Framework的一部分,也是现有的Spring MVC编 程模型的延续,因此,并没有所谓的“Spring REST framework”这种概念,有的只是Spring和Spring MVC。这意味着如果你有一个Spring应用的话,你既可以使用Spring MVC创建HTML Web层,也可以创建 RESTful Web Services层。

关于文中的代码片段

文中的代码片段假想了一个简单的领域模型:两个JPA注解实体,分别是Account和Portfolio,其中一 个Account对应多个 Portfolio。持久层使用Spring配置,包含了一个JPA仓储实现,用于获取和持久化实 体实例。Jersey和Spring MVC用于构建Web Services层,通过调用底层的Spring托管应用来服务客户端请 求。

引导程序与Web层包装

我们会在Spring MVC和JAX-RS中都使用Spring实现依赖注入。Spring MVC DispatcherServlet和 Jersey SpringServlet会把请求代理给Spring管理的REST层组件(控制器或资源),后者会由业务或持久 层组件包装起来,如下图所示: