维普资讯 http://www.cqvip.com
第24卷第10期 2007年10月 计算机应用与软件 Computer Applications and Software Vo1.24 No.10 Oct.2oo7 基于Spring框架的Web Services系统整合与研究 朱铮雄 (上海安钦信息科技技术有限公司上海200025) 摘要 Web Sefvices通过集成第三方Web服务能够提高应用系统开发效率。但是传统的Web Services在开发中存在代码开发 效率低、复用性羞,而且可扩展性差。应用现在流行的轻量级Spring容器对Web Sevrices进行系统整合,可大大提高开发效率,有效 降低开发成本。 关键词 Spring Web Services IoC(Inversion of Contro1) AOP(Aspect—Oriented Programming) RESEARCH oN INTEGRATIoN oF WEB SERVICES BASED oN SPRING FRAMEWoRK Zhu Zhengxiong (Shanghai Engineware Technology Co.Ltd,Shanghai 200025,China) Abstract Web Services technologies accelerate application development by allowing the integration of third—party Web Services.But tradi— tional Web services have deficiency in efficiency,reusability and extensibility.An integration of Web Services based on famous open—source Spring framework is introduced to improve the efficiency and reduce the cost of development. Keywords Spring Web Services IoC(Inversion of Contor1)AOP(Aspect—oriented programming) 户定义的Client端接口创建适配对象。从而避免了直接操作底 0 引 言 基于XML的Web Services可以看作提供特定功能元素的 可编程实体。Web Sevirces技术采用SOAP协议实现远程对象 访问,而SOAP是以XML和HTI'P为基础的。由于XML和HT— 层的接口,减少了客户端的冗余.屏蔽了调用相关的复杂性。由 于是动态创建,因而性能比较差,所以使用的不多。使用静态 Stub是目前最常用的调用方式,由于采用静态编译,便于定制和 实现性能最优。使用该方式需要利用支持环境(比如Axis)所 提供的工具,根据WSDL预生成Web Services客户端实现代码。 但是如果服务的WSDL发生变化,就必须重新生成新的客户端 代码并进行重新部署。由此可见如果我们采用这样JAX-RPC 使用静态的Stub方式对Web Services调用存在下面几个方面的 瓶颈,影响我们开发效率和开发质量: ・访问Web Services所需要的配置代码(如服务器段地 TP作为Interact标准被广泛接受,将Web Services直接部署在 Web上,任何数量的异构系统都可以用这些常见的Interact标 准访问这些服务。 从Web Services动态配置管理人手,在解决一系列具体问 题的过程中,使用IoC和AOP等方法设计Web Services的访问 代码,使得业务逻辑与Web Services访问解耦。Spring是一个流 行的轻量级容器,对IoC和AOP提供了良好的支持。本文提供 一址,用户名密码等)被嵌入应用逻辑之中,对环境依赖程度比较 高。因此我们需要一种能够适合在环境变化的、不修改源代码 就可以直接改变Web Services的访问配置机制。 个基于Spring框架下更加灵活便利和易于扩展的访问模式。 1 Web Services动态配置管理架构 Web Services的核心特征之一是服务的实现与使用之间的 ・客户端代码与Web Services访问代码绑定,是紧耦合结 构,不利于开发过程中的单元测试和模拟运行代码,以及对Web Services动态管理,所以,需要对客户端与远程服务之间解耦。 ・客户端一旦增加对Web Sevrices访问的核心操作(例 如:Web Services的性能监控、权限验证等),就会影响系统中许 抽象化,除了客户端和提供服务的程序之外,开发人员无需了解 其他信息,除了客户端和提供的程序之问无需了解其他信息,这 是Web Services实现松耦合互操作的基础。JAX—RPC…作为Ja— va平台的RPC服务调用标准接口,为Web Services客户端调用 提供了3种方法:DII(Dynamic Invocation Interface)、动态代理和 多不同的组件,并且其中一些操作通常要求我们能够灵活配置 来实现不同的策略。因此我们不应该将处理与核心模块操作相 关联的代码和应用代码混合。 从系统设计角度来讲,应用系统与Web Sevirce的解耦合可 以解决上述三个问题。Spring是轻量级的开源JAVA框架,提供 了良好的IoC和AOP支持。通过IoC和AOP我们就能达到 收稿日期:2006—12—06。朱铮雄,本科,主研领域:分布式系统在 互联网的应用。 静态Stub。DII采用直接调用方式,可以在程序中设置诸多的调 用属性,使用较为灵活,但是调用过程却相对繁琐复杂,易造成 代码膨胀和可重用性低,每次调用不同的Web Services都要重 复进行大量编码。JAX—RPC中采用动态代理(Dynamic Proxy) 的方法实现对Web Services的动态调用,可以在运行时根据用 维普资讯 http://www.cqvip.com
第10期 朱铮雄:基于Spring框架的Web Services系统整合与研究 129 Web Services与系统应用的解耦合,从而比较好地解决了上面 提出的三个问题,实现了系统与Web Services的整合。 为Aspects。AOP的主要目的仍然是解耦,在分离关注点后,才 能将关注点的变更控制在一定范围内,增加程序的灵活性,才能 使得关注可根据需求和环境作出随时调整。 Spring提供了丰富的面向切面的支持。我们通常采川环绕 2基于IoC和AOP的动态Web Services管理 2.1 IoC反转控制[2 3 IoC(Inversion of Contro1)意为控制反转,其背后的概念常被 表述为“好莱坞法则”:“Don’t call me,I'll call you.”IoC将一部 分责任从应用代码交给framework(或者控制器)来做。通过IoC 可以实现接口和具体实现的高度分离,降低对象之问的耦合程 度。Spring是一个非常流行的IoC容器,它通过配置文件来定 义对象的生命周期和依赖关系,并提供了良好的配置管理能力。 我们根据服务WSDL提供的接口定义接口 Public interface RemoteServices extends Remote{ void getRemoteMethod()throws ReoteException; //根据WSDL描述的服务接口 f Spring利用类工厂来创建和配置对象。在Spring框架中, 已经为基于JAX.RPC的Web Services调用提供了一个客户端代 理的类工厂实现:JaxRpcPortProxyFact。ryBean 。在配置文件 bean.xml中,我们将使用JaxRpcPortProxyFactoryBean来创建和 配置Web Services的客户端代理“remoteServices”。 <bean id=“remoteServices” class=“org.springframework.remoting.jaxrpc.JaxRpcPortProxyFactory— Bean”> <property name=‘‘wsdlDocumentUrl”> <value>……</value> </property> <property name=“ServicesInterface’’> <value>…・一.RemoteServices</value> </property> </bean> . 在客户端调用remoteServices,并且采用set方法注入,remoteServices 就可以被直接调用 public ClientPort{ public RemoteServices remoteServices; public void setRem0teServices(RemoteServices remoteServices){ this.remoteServices=remoteServices: } remoteServices.getRem0teMeth0d(); //调用远程的Web Services方法 } } 在客户端使用类中,我们没有涉及到任何与Web Services 配置或者调用相关代码,真正达到了解耦合,易于客户端代码移 植和测试。完成了Web Sevrices整合目的。 2.2 AoP动态管理 AOP是一种新兴的方法学,它最基本的概念就是关注隔 离。AOP提供了一系列的技术使得我们能够从代码中分离那 些影响到许多系统模块的crosscutting concerns,并将他们模块化 方式 来横切应用模块,Spring中的环绕通知可以在目标方法 之前和之后运行,也可以定义在调用目标方法。我们以权限设 计中权限控制来简单说明一下AOP基本设计和实现。 public class TestAutborityInterceptor implements Meth0dIntercept0r{ public Object invoke(MethodInvocation invocation)throws Throw— able{ Integer userType=invocation.getMethod().getType(); if(user.getType().equals(userType)){ //user的权限控制拦截调用相应横切功能模块 retum null; } retum invocation.proceed(); //用proceed()方法来调用目标方法 } 配置相关spring的bean文件 <bean id=‘‘authorityTarget’’ class=“org.springframework.aop.framework.ProxyFaetoryBean”> <property name=“int6rcept0rNames”> <list> remoteServices </list> </property> ●●●●●● </bean> 3实例分析 为了说明这套构架的实际应用,介绍一个网站系统,这个系 统整合了短消息的Web Servicess。根据WSDL定义的短消息接 口,我们定义了sendSMSRemote接口。 public interface SmsRemote extends Remote{ Public boolean sendSMS(Stirng phoneNumber,String content); 配置Bean文件中的prope ̄y设置sms的基本属性,包括地 址和验证序列号,这样测试账号和真实帐户切换的时候无需修 改代码,仅仅修改配置文件就完成了测试系统到真正上线系统 的切换。 此外由于还需要对所有短消息进行统计,环绕通知Method— Interceptor的proceed()方法获取事务处理返回对象,根据对象 状态来统计和记录整个短消息发送情况。 public void invoke(MethodInvocation invocation){ Sins sms=(Sms)invocation.getArguments()[0]; //获取当前短消息对象 If(((Boolean)invocation.proceed()).booleanValue()){ //发送成功 //记录发送时间,发送短消息内容和手机号码 SmsService.add(sms); }else{ (下转第132页) 维普资讯 http://www.cqvip.com