快速业务通道

AOP@Work:介绍AspectJ 5 - AspectJ中的Java 5支持和其他新特性抢鲜看 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15
也给出了 AspectJ 5 能做什么的提示。但是在 AspectJ 5 中除了 注释匹配之外还有许多东西,在下一节中会看到。

AOP@Work:介绍AspectJ 5 - AspectJ中的Java 5支持和其他新特性抢鲜看(5)

时间:2011-09-04 IBM Adrian Colyer

连接点匹配和注释

在 AOP@Work 系列以前的文章中,介绍了注释、元数据和面向方面编程之间的 关系 (请参阅 参考资料 一节中的 “AOP and metadata”),所以这里不再赘 述,直接介绍 AspectJ 5 能做的一些事情。

出于示例的原因,我将采用 EJB 3.0 规范中的一些注释(请参阅 参考资料) 。对于具有相关事务策略的方法,可以用 @Tx 注释进行注释。例如:

@Tx(TxType.REQUIRED) void credit(Money amount) {...}

如果想编写 TransactionManager 方面,那么可能会对带有 @Tx 注释的方法 的执行感兴趣。编写与它们匹配的切入点很简单,如清单 7 所示:

清单 7. 匹配事务性方法的执行

public aspect TransactionManager {   /**    * The execution of any method that has the @Tx    * annotation    */   pointcut transactionalMethodExecution() :      execution(@Tx * *(..));   /**    * Placeholder for implementing tx policies    */   Object around() : transactionalMethodExecution() {     return proceed();   } }

匹配注释方法的调用和执行

execution(@Tx * *(..)) 切入点表达式匹配任何方法的执行,可以使用任何 名称、任何类型、任何参数,只要方法用 @Tx 注释。如果需要,也可以缩小范围 。到事务性方法的匹配 调用 同样简单,只需编写“call(@Tx * *(..))”即可。

AOP@Work:介绍AspectJ 5 - AspectJ中的Java 5支持和其他新特性抢鲜看(6)

时间:2011-09-04 IBM Adrian Colyer

在这种情况下,实现事务策略的建议需要知道执行方法上的 @Tx 注释的 value。使用 AspectJ,可以把连接点的上下文值绑定到切入点表达式,然后向建 议公布上下文。在 AspectJ 5 中,用新的切入点指示符 @annotation 把这个能 力扩展到了注释上。像 AspectJ 中所有的其他上下文绑定切入点指示符一样, @annotation 扮演着双重角色:既把连接点匹配限制到主题(方法、字段、构造 函数等)具有指定类型注释的连接点上,又公开那个值。可以很容易地重新定义 TransactionManager 方面,让它利用这一优点,如下所示:

清单 8. 公开注释值

public aspect TransactionManager {   /**    * The execution of any method that has the @Tx    * annotation    */   pointcut transactionalMethodExecution(Tx tx) :      execution(* *(..)) && @annotation(tx);   /**    * Placeholder for implementing tx policies    */   Object around(Tx tx) : transactionalMethodExecution(tx) {     TxType transactionType = tx.value();     // do before processing      Object ret = proceed(tx);     // do after processing      return ret;   } }

运行时持久性

在使用 @annotation 来匹配注释时,注释类型必须拥有运行时持久性(否则 AspectJ 就不能在运行时公开注释值)。就像前面看到的,匹配只使用 execution 就能处理只具有类文件持久性的注释。

到目前为止所展示的技术,处理的都是基于字段的连接点。假设有个字段用 @ClassifiedData 注释,那么可以编写清单 9 所示的两个切入点中的一个,具体 取决于是否需要公开实际的注释值:

清单 9. 带注释的字段

 /**   * Any access or update to classified data   */   pointcut classifiedAction() :    get(@Classified

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