快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15
Data * *) || set(@ClassifiedData * *);  /**   * Alternative declaration:   * Any access or update to classified data,   * exposes the annotation to provide access to   * classification level attribute   */   pointcut classifiedAction(ClassifiedData classification) :    (get(* *) || set(* *)) && @annotation(classification);

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

时间:2011-09-04 IBM Adrian Colyer

匹配带注释的类型

在结束关于注释的讨论之前,先深入研究一下 AspectJ 5 如何支持在类型上 进行注释匹配的。AspectJ 允许指定类型模式,可以用注释模式 限定该模式。到 目前为止,我一直用的都是最简单的注释模式 @Foo,它在主题有 Foo 注释时匹 配。可以进行组合,在主题既有 Foo 注释 又 有 Goo 注释时,“@Foo @Goo”匹 配。在主题或者有 Foo 注释或者 有 Goo 注释时,“@(Foo || Goo)”匹配。请 参阅 AspectJ 5 Developers Guide 中关于注释模式的讨论(在 参考资料 中) ,获取更多细节。

在 EJB 3.0 中,会话 bean 可以使用 @Stateful 或 @Stateless 进行注释。 类型模式“@(Stateless || Stateful) *”匹配的是有这两个注释之一的类型。 出于某种原因,如果想把 TransactionManager 方面限制到只处理会话 bean,那 么可以像下面这样重新定义 清单 8 的 transactionalMethodExecution 切入点 。

  pointcut transactionalMethodExecution(Tx tx) :      execution(* *(..)) && @annotation(tx)     && within(@(Stateless || Stateful) *);

可以把这段代码读作“匹配在具有 Stateless 或 Stateful 注释的类型中带 有 Tx 注释的任何方法的执行”。另一种编写它的方法是直接在切入点表达式中 表达这个类型模式:execution(* (@(Stateless || Stateful) *).*(..)),但是 我认为前者更清楚。(注意,如果使用 call 则不是 execution,那么两者之间 会有显著差异:前者匹配从会话 bean 中发出的对事务方法的调用,而后者匹配 对在会话 bean 中定义的事务方法的调用。)

更多切入点指示符

AspectJ 为匹配和公开注释定义了更多切入点指示符:

@withincode 匹配的连接点,由拥有指定注释的成员(方法、构造函数、建议 )代码的执行产生。 @within 匹配的连接点在拥有指定注释的类型内部。 @this 在匹配的连接点中,对象目前绑定到有指定注释的 this。 @target 匹配的连接 点的目标有指定注释。 @args 匹配的连接点的参数拥有指定注释。

AspectJ 5 中的泛型

Java 语言中对泛型的新支持是 Java 5 中引入的争议最大的变化。泛型 声明 时使用一个或多个 类型参数,而这些类型参数在声明该类型的变量时绑定到具体 的类型规范。泛型最常使用的示例是 Java 的集合类。Java 5 中的 List 接口是 个泛型,带有一个类型参数 —— 列表中元素的类型。根据约定,单一字母用于 表示类型参数,list 接口可能声明为:public interface List<E> {...} 。如果想创建引用字符串列表的变量,可以把它声明为类型 List<String> 。泛型 List<E> 把自己的类型参数 E 绑定到 String,从而创建 参数化 类型 List<String>。

从 清单 4 显示的代码中摘出来的 LifecycleManager 方面,包含类型间声明 中使用的参数化类型 (List<LifecycleObserver>)的一个示例。AspectJ 5 也允许在泛型上进行类型间声明。清单 10 显示了一个泛型 DataBucket<T> ,以及一个在它上面进行类型间声明的方面:

清单 10. 泛型上的类型间声明

 public class DataBucke

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