快速业务通道

AOP@Work: AOP和元数据:完美的匹配,第1部分 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15
unt(..))      || execution(void Account.credit(..))      || execution(void Account.debit (..));   Object around() : transactedOps() {      try {        beginTransaction();        Object result = proceed();        endTransaction();        return result;      } catch (Exception ex) {        rollbackTransaction();        return null;      }    }   ... implementation of beginTransaction() etc. }

对于需要很少底层系统信息的方面,这个方案可以工作得很好。例如,如果希 望启用池功能,可以编写一个一般性的方面,通知对池中资源进行创建和销毁调 用。可是对于不能用一般方法捕获所需连接点的横切功能,这种方法存在局限性 。首先,这个方面不是可重用的,因为切入点定义是特定于系统的。其次,对系 统的改变可能使这个方面也作出改变。换句话说,系统的第一个版本使我们得到 程序元素与切入点之间的一个 N 对一的耦合。因为这不是最佳选择,所以我还要 再努力。

AOP@Work: AOP和元数据:完美的匹配,第1部分(9)

时间:2011-09-04 IBM Ramnivas Laddad

版本 2:可重用的方面

我的第二个努力通过使之可重用来改进这个示例方面。我抽取了方面的可重用 的部分,并增加了一个以特定于系统的方式定义切入点的子方面(subaspect)。 图 2 显示了提取了基本方面的结构:

图 2. 提取一个可重用的事务管理方面

图 2. 提取一个可重用的事务管理方面

清单 2 显示了这个基本方面,它现在是可重用的了。可以注意与清单 1 相比 的两个改变:这个方面标记为 abstract,并且 transactedOps() 切入 点也标记为 abstract,而且删除了对它的定义:

清单 2. 可重用的事务管理基本方面

public abstract aspect TxMgmt { public abstract pointcut transactedOps(); Object around() : transactedOps() { try { beginTransaction(); Object result = proceed(); commitTransaction(); return result; } catch (Exception ex) { rollbackTransaction(); return null; } } ... implementation of beginTransaction() etc. }

AOP@Work: AOP和元数据:完美的匹配,第1部分(10)

时间:2011-09-04 IBM Ramnivas Laddad

下一步,需要为这个基本方面编写一个子方面。下面的子方面定义了一个捕获 需要事务管理支持的连接点的切入点。清单 3 显示了一个特定于银行的子方面, 它扩展了清单 2 中的 TxMgmt 方面。这个子方面定义了具有与清单 1 相同定义 的 transactedOps() 切入点。

清单 3. 特定于系统的子方面

public aspect BankingTxMgmt extends TxMgmt { public pointcut transactedOps() : execution(void Customer.setAddress(..)) || execution(void Customer.addAccount(..)) || execution(void Customer.removeAccount(..)) || execution(void Account.credit(..)) || execution(void Account.debit (..)); }

虽然有了改进,但是这种设计仍然是一个子方面与类之间的 N 对一依赖关系 。银行系统的事务要求的任何改变都需要修改 BankingTxMgmt 的切入点定义。这 与理想差得还很远,我将继续努力。

版本 3: Participant 模式

我在上面解决了重用性的问题,但是仍然需要避免 N 对一的依赖关 系。可以使用 Participant 模式(请参阅参考资料)做到这一点。不是在整个系 统中使用一个子方面,而是使用许多子方面 —— 每个子系统一个子方面,这使 得编写相对稳定的切入点成为可能。在这个上下文中,一个子系统 可 以是一个包、一组包,甚至是一个类。图 3 显示了不同元素之间的结构关系:

图 3. 使用 participant 设计模式

图 3. 使用 participant 设计模式

AOP@Work: AOP和元数据:完美的

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号