快速业务通道

用AOP增强契约:用AspectJ为Java软件开发加入契约式设计 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15
)    {      System.out.println("Performing post conditions check");      cManager.checkPostConditions(thisJoinPoint.getTarget(), obj, thisJoinPoint.getArgs());    }    if (cManager!=null)     {      System.out.println("Performing final invariants check");      cManager.checkInvariants(thisJoinPoint.getTarget ());    }    return obj;   } }

用AOP增强契约:用AspectJ为Java软件开发加入契约式设计(5)

时间:2011-09-07 ibm Filippo Diotalevi

AbstractContract 方面表示两个抽象方法,在实现具体的契约检查器方面时 必须实现这两个方法:

public abstract pointcut targetPointcut() 表示其中必须应用 advice 的 pointcut。pointcut 必须是一个方法调用。

public abstract ContractManager getContractManager() 必须返回实现了 正确的契约检查的 ContractManager 的一个实例。

一定要注意不变量检查执行了两次,是在服务执行之前和之后。这使您可以 检 查服务的执行有没有影响一些外部字段的值。

契约的失败会导致 ContractBrokeException ,这会停止 advice 的执行。

实际的契约检查

理解了用 AOP 实现契约式设计的必要基础设施后,就可以让它工作了。假定 需要查询一个外部客户关系管理 (CRM) 系统以获取客户的数据。可能像下面 这 样调用 CRM 系统:

Customer cus = companyCustomerSystem.getCustomer("Pluto");

从开发人员的角度看, getCustomer 函数的实现是不重要的,因为 getCustomer 是一个外部组件。但是检查它是否返回破坏性的结果是非常重要的 。它与保证应用程序不传递错误或者无意义的输入给 CRM 系统同样重要。可以 通 过开发一个扩展了 AbstractContract 的具体方面解决这两种意外情况。具体的 方面覆盖两个方法:

targetPointcut(),定义应用契约检查的 pointcut。

getContractManager(),定义负责执行所有检查的 ContractManager实现。

清单 3 显示了示例应用程序的具体方面:

清单 3. 具体契约方面

public aspect CcCompanySystem extends AbstractContract { public pointcut targetPointcut(): call(Customer CompanySystem.getCustomer(String)); public ContractManager getContractManager() { return new CompanySystemContractManager(); } }

CcCompanySystem方面指定契约检查器调用的 CompanySystemContractManager将对由 CompanySystem类的 getCustomer方法的 调用所表示的 pointcut 应用。不需要定义契约检查操作的控制逻辑,因为它继 承自 清单 2中的前辈 AbstractContract抽象方面。

用AOP增强契约:用AspectJ为Java软件开发加入契约式设计(6)

时间:2011-09-07 ibm Filippo Diotalevi

最后一步是开发一个进行契约检查的 Java 类。如前所述,这个类必须实现 ContractManager接口。清单 4 显示了一个示例 CompanySystemContractManager类:

清单 4. 示例应用程序的 ContractManager 实现

public class CompanySystemContractManager implements ContractManager { /** * Check preconditions */ public void checkPreConditions(Object thisObject, Object[] args) throws ContractBrokeException { Object arg = args[0]; if (arg == null) { throw new ContractBrokeException("PRECONDITION ERROR: " + " Argument of getCustomer shouldn''t be null"); } } /** * Check postconditions */ public void checkPostConditions(Object thisObject, Object value, Object[] args) throws ContractBrokeException { if (value == null) { throw

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