AOP@Work: AOP和元数据:完美的匹配,第2部分-用元数据实现多维接口 - 编程入门网
次结构的签名模式的全局方面 可以做得更好。
AOP@Work: AOP和元数据:完美的匹配,第2部分-用元数据实现多维接口(6)时间:2011-09-04 IBM Ramnivas Laddad利用命名约定:如果项目使用良好的命名约定,那么最好在横切时也使用它们 。遵循好的命名约定本身也很有用。例如,可以使用一个 execution(* *.get* ()) || execution(boolean *.is*()) 切入点捕获所有 getter 方法的执行,对 所有 setter 使用 execution(void *.set*(*))。注意切入点是如何指定类型和 通配符的 —— getter 没有使用任何参数,并且以“is”开始的 getter 返回一 个布尔值,而 setter 采用了一个参数并返回 void。在某些情况下,这种命名风 格会捕获错误的元素,比如有一个 settle() 方法,当它返回一个 void 并且采 用某一个参数时(请参阅参考资料中 Sam Pullara 的 blog 对这种情况的介绍) 。 在切入点中排除符合这个表达式、但并不需要的连接点通常会更好一些,特别 是考虑到忘记在上面例子中加入 @Getter 和 @Setter 注释的时候。 使用标准 API 模式:标准 API 和扩展点的调用都将获得良好定义,并且可以 用使用了通配符的签名模式很容易地捕获这些调用。比如考虑想要捕获对任意 Swing 组件的所有监听器的调用时。一个使用类似 call(void JComponent+.add*Listener(EventListener+) 这样的方法签名的切入点可能不需 要任何注释。这种切入点只在极其例外的条件下才会匹配不需要的方法。如果使 用元数据注释,那么忘记用注释标注方法的可能(请参阅 @ListenerManagement )要大于捕获不需要的方法。 利用组件和框架边界:组件和框架边界(如对 Web 服务组件、JDBC API 或者 Hibernate API 的调用或者其扩展点)通常都是经过定义良好的,并且不使用显 式元数据就可以很容易地通过切入点表达式捕获它们。下面考虑一个监视远程调 用的方面实现。可以通过关注类是否实现 Remote 来很方便地推断远程方法调用 ,或者用方法签名的异常部分作为参数,像 Remote+.*(..) throws RemoteException 这样的内容。在这种情况下,使用元数据不但增加了工作的难 度,而且还可能导致方法丢失。 这里的核心思想是避免将元数据作为第一选择的诱惑,而是坚持提取程序元素 的签名模式,编写没有元数据的切入点。有了通配符、继承层次、包结构、好的 命名约定以及好的切入点组合,在许多情况下,您可以得到可以接受的切入点。 但要正确地应用这些技术,则必须对所使用的 AOP 系统的切入点语言有很好的了 解,而这种学习的努力是值得的。 2. 使用方面继承 AOP blog 和讨论组中一直在继续的讨论表明,许多开发人员对日志和跟踪例 子感到迷惑。对于这些操作,一般会找到在整个系统中都很稳定的切入点,这意 味着可以对整个系统编写一个方面。不过,在试图对其他横切功能使用同样的方 法时,它变得不可伸缩。如果可以编写一个切入点表达式,那么它会随着系统的 发展而变得复杂,并且通常不很稳定。这会使新来者认为 AOP 的实现是困难和或 者不完善的。 技巧在于:当不能为整个系统定义一个签名时,要知道将它分解成小的子系统 ,并为每个子系统定义切入点。有很多将系统分解为几部分并找出每个部分的好 的签名模式的可能。前面的准则可以在子系统级别上提供帮助。 使用方面继承首先要创建一个抽象的方面,它包含实现的大部分(通知、内部 类型声明等)和几个抽象切入点(请参阅 清单 4)。然后将系统分解为几部分, 使得每个子系统都可以有好的切入点表达式。子系统可以像整个系统那么大,也 可以像类那么小。这种技术是我在 第 1 部分 讨论的 Participant 模式的核心 。Participant 模式可以将简单的方面转换为更复杂的方面,如负责事务管理 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |