快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15
匹配,第1部分(11) 时间:2011-09-04 IBM Ramnivas Laddad

清单 4 显示了具有参与者子方面的 Customer 类,它负责定义嵌入类的切入 点。

清单 4. 带有嵌入参与者方面的 Customer 类

public class Customer { public void setAddress(Address addr) { ... } public void addAccount(Account acc) { ... } public void removeAccount(Account acc) { ... } ... private static aspect TxMgmtParticipant extends TxMgmt { public pointcut transactedOps() : execution(void Customer.setAddress (..)) || execution(void Customer.addAccount(..)) || execution(void Customer.removeAccount(..)); } }

示例 Customer 类中的子方面只是枚举所有以通配符作为参数的方法。不过在 现实中,可能会使用通配符简化切入点的定义。例如,可以使用下面的定义,声 明 transactedOps() 切入点捕获类的所有公共方法:

public pointcut transactedOps() : execution(public * Customer.*(..));

在清单 5 中,可以看到 Account 类是如何嵌入一个子方面,从而参与系统的 事务管理功能。

清单 5. 带有嵌入参与者方面的 Account 类

public class Account { public void credit(float amount) { ... } public void debit(float amount) { ... } public float getBalance() { ... } ... private static aspect TxMgmtParticipant extends TxMgmt { public pointcut transactedOps() : execution(void Account.credit(..)) || execution (void Account.debit(..)); } }

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

时间:2011-09-04 IBM Ramnivas Laddad

与 Customer 类一样,增加这一步会简化这个切入点。例如,如果发现除了 getBalance() 方法之外,所有公共方法都需要在事务管理中执行怎么办?可以定 义这个切入点,按下方所示方法捕获这种实现:

public pointcut transactedOps() : execution(public void Account.*(..)) && !execution(float Account.getBalance ());

现在,如果类发生改变,那么只需要修改类中嵌套的子方面即可。我已经将系 统耦合减少到每个子方面所捕获的更少的程序元素数(比如说从 n 减少到 1), 以此取代了那个大大的 N。而且,如果类改变了事务管理需求,只需要改变嵌入 的参与者方面中的切入点即可,这样可以防止局部性。

这个例子展示了在关于 AOP 的讨论中常常会漏掉的重要一点:如果试图找到 整个系统的签名模式,那么就会看到一个令人不快的意外 —— 不稳定的、复杂 的和不正确的切入点。不过,考虑系统的子集时,通常会发现对整个子系统都适 用的签名模式。使用每个类具有一个方面的 Participant 模式,将每个类视为一 个子系统,而将任何逻辑分为子系统都可以做得很好。

这种解决方案对于大多数情况是合理的。它的不利之处是类直接依赖于基本方 面,因此基本方面必须总是出现在系统中。这种解决方案的另一个问题是它的横 切功能不能使用,除非类通过嵌入嵌套的子方面显式“参与”协作。这个问题更 多时候与横切功能的本性有关、而不是与解决方案有关。并且,很快您就会看到 ,可以对它稍加改进。

版本 4: 基于元数据的切入点

在这个回合中,我准备修改每一个方法,让它有一个注释,并退回到只在系统 中使用一个子方面(像在 版本 2 中一样)。不过,这次我的子方面将使用一个 基于元数据的切入点来捕获所需要的连接点,该连接点携带我提供的注释的方法 。这个子方面本身可以在系统中重用。图 4 显示了这个版本的示意图。

图 4. 元数据驱动的事务管理

图 4. 元数据驱动的事务管理

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

时间:2011-09-04 IBM Ramnivas L

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号