Web Service 实现 SOA 的关注点分离
【 导 读 】 关 注 点 分 离 (separation of concerns) 是 面 向 服 务 的 架 构 (Service-Oriented
Architectures,SOA)的核心原则。本文中我们将演示如何使用 Apache Axis 和 Spring 来开发
Web service,并使用 Acegi Security 对其进行保护——同时保持关注点很好地分离。
关注点分离(separation of concerns)是面向服务的架构(Service-Oriented
Architectures,SOA)的核心原则。令人遗憾的是,该原则在实现 SOA 服务时常常起不
到作用。我们通常会看到带有多个关注点(如安全、事务 管理)的巨大的实现类,使用业务
逻辑记录所有混合在一起的关注点。使用 Spring Framework 和 Aspect Oriented
Programming (AOP)原则,我们可以将关注点分离,以用于服务实现。
本文中我们将演示如何使用 Apache Axis 和 Spring 来开发 Web service,并使用 Acegi
Security 对其进行保护——同时保持关注点很好地分离。
动机和设计
本文中我们将使用的示例是名为 FundsTransferService 的服务,银行使用该服务将资金
从一个账户转移到另一个账户。可以在本文的参 考资料部分找到该服务的 WSDL 及所有
源代码、配置文件和构建文件。我们有意让该服务保持非常简单,以便集中讨论本文更有
意义的方面。在本服务的实现中, 我们将涉及三个关注点:
Web service 管道,用来公开作为服务的功能
用于转移资金的业务逻辑
安全性,用于保证只有经授权的用户才能执行资金转移
而真正的系统很可能是必须处理其他的关注点,如事务管理、日志等。
我们想设计这样一种实现,处理每个关注点的代码与其他的代码完全分离。对于 Web
service 管道,我们将使用 Axis 来公开作为服务的功能。用于将资金从一个账户转移到另
一个账户的业务逻辑将封装在一组 POJO(Plain Old Java Object)中。将通过 Acegi
Security 框架来提供安全性。我们将使用 Spring Framework 及其 AOP 工具把各方面联
系起来,使构成该 Web service 实现的所有代码之间的依赖性减到最小。
该实现的设计如图 1 所示。以黄色表示的对象就是我们需要实现的 Web service。以蓝色
表示的对象来自 Axis;以粉红色表示的对象来自 Acegi;以绿色表示的对象来自 Spring。
FundsTransferService 是 WSDL 中所定义的服务接口。为了简化图表,我们将所有
Axis 类显示为名为 Axis Engine 的组件。BasicHandler 也是 Axis 类,但由于它对于设
计比较重要(稍后详述),所以单独显示出来。 FundsTransferServiceSoapBindingImpl
是 Axis 的生成类,需要实现它来提供服务功能。将直接通过 Spring 委派业 务逻辑 POJO
AccountMgrImpl(稍后也会对此进行详细解释)。AccountMgrImpl 与 AccountMgr 接
口捆绑在一起是不错的做法,因为这样 就允许我们插入 Spring 以发挥其作用(尽管有其他
方法可以不带接口使用 Spring)。