快速业务通道

什么是AspectJ - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17
的钱数   // End Transaction } public float withdraw(AccountInfo account, float money){   // 验证account是否为合法用户   // Begin Transaction   // 减少account账户的钱数,返回取出的钱数   // End Transaction } };

我们看到,这些与商业逻辑无关的重复代码遍布在整个程序中。实际的工程项目中涉及到的类和函数,远远不止两个。如何解决这种问题?

我们首先来看看OOP能否解决这个问题。

什么是AspectJ(3)

时间:2011-05-15 IBM 王海龙

我们利用Design Pattern的Template Pattern,可以抽出一个框架,改变上面的例子的整个设计结构。

类和方法的定义如下:

Code 2.4 Base.java abstract class Base{ public float importantMethod(AccountInfo account, float money){   // 验证account是否为合法用户   // Begin Transaction   float result = yourBusiness(account, money)   // End Transaction   return result; } protected abstract float yourBusiness(AccountInfo account, float money); }; Code 2.5 BankDeposit.java class BankDeposit extends Base{ protected float yourBusiness(AccountInfo account, float money){   // 增加account账户的钱数,返回账户里当前的钱数 } }; Code 2.6 BankWithdraw.java class BankWithdraw extends Base{ protected float yourBusiness(AccountInfo account, float money){   // 减少account账户的钱数,返回取出的钱数 } };

这里我们用一种很勉强的方法实现了认证和事务代码的重用。而且,有心的读者可能会注意到,这种方法的前提是,强制所有的方法都遵守同样的signature。

如果有一个转账方法transfer(AccountInfo giver, AccountInfo receiver, float money),由于transfer方法的signature不同于yourBusiness的signature,这个方法无法使用上面的框架。

这个例子中提到的认证,事务等方面,就是AOP所关心的Aspect。

AOP就是为了解决这种问题而出现的。AOP的目的就是--Separation of Aspects (or Separation of Concerns).

下面的章节,解释EJB Descriptor,AspectJ,xDoclet等工具如何解决Separation of Aspects的问题。

3.EJB Descriptor

如果我们使用EJB实现上面的例子,Bank类可以作为一个Stateless Session Bean实现。

在Bank的代码中只用考虑商业逻辑,不用考虑认证和事务等方面。

认证和事务等方面在EJB Descriptor中定义,由EJB Container提供这些方面的实现。

我们来看一下,如何使用EJB Descriptor描述上面的例子。

什么是AspectJ(4)

时间:2011-05-15 IBM 王海龙

EJB Descriptor包括一个ejb-jar.xml文件。ejb-jar.xml文件包含两大部分,enterprise-beans和 assembly-descriptor部分。enterprise-beans部分包含EJB的定义--JNDI Name,EJB Home, Interface, Bean Class Path等;assembly-descriptor部分包括配置信息的定义--安全角色,事务控制等等。

下面给出上面例子对应的模拟EJB Descriptor。

<ejb-jar> <enterprise-beans>   <session>     <ejb-name>Bank</ejb-name>     …      <ejb-class>example.Bank</ejb-class>     <session-type>Stateless</session-type>     <transaction-type>Container</transaction-type> <security-role-ref> <role-name>bank-account</role-name> </security-role-ref>   </session> </enterprise-beans> <assembly-descriptor>   <security-role>    <

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