2010-11-30 211 views
30

首先让我注意一点,我使用AspectJ和我喜欢它,但是我还能用它做些什么。AspectJ的优点是什么?

我知道AspectJ可以被用于记录。在某些情况下,它用于事务控制 - 主要与注释一起实施。 AspectJ也可以用来增强(代码生成)方法的类,就像Spring Roo一样。但我相信AspectJ和AOP一般来说,可以用于多于:日志记录,事务控制和模拟部分类。

那么AspectJ和AOP有哪些其他有用的用例呢?

+2

您应该阅读Ramnivas Laddad的AspectJ in Action http://www.manning.com/laddad2 TOC将为您提供理念:http://www.manning.com/laddad2/excerpt_contents.html – 2010-11-30 12:40:04

+2

@George Stocker:这个问题有14个upvotes,0个downvotes,3个答案,总共有21个upvotes,你在4年后搁置 - 真的?问题是这个问题有很好的答案,所以它没有真正存在这个“太宽泛”的问题。 – Ralph 2014-08-10 12:09:46

回答

26
  • 权限检查
  • 中断操作时间过长
  • 运行动作单独的线程,甚至在不同的进程或事件的背景下其他机器
  • 监控
  • 前准备的任何数据/环境上呼叫后处理结果
  • 开启/关闭资源

编辑

虽然我给了这个答案很多年过去了,但我决定添加以下内容来使答案更加完整。

  • 安全检查。
  • 修复了您无法更改的API错误或行为。例如在某些情况下返回false的布尔方法,但应返回true。您可以使用AspectJ修复此问题。
16

Wikipedia entry给你几个例子(但不是那么多)。通常情况下,面向方面的编程只能用于实现简单的行为,这些行为不属于某个类的核心关注部分,并且对于不同的类是共同的。只要你开始在你的方面投入太多的逻辑,代码变得真的不可读。

您建议的方面(日志记录,交易等)是最常用的方面。我也会增加安全性。

2

可以使用AspectJ来执行一些(设计)规则。


进样嘲笑在原本将通过使用新创建新实例类。 假设你有这样的代码:

public void sendInvitationEmail(String address) { 
    InvitationEmail email = new InvitationEmail(); 
    email.sendTo(address).send(); 
} 

而且需要通过模拟来代替email。然后你可以使用一个方面(@Pointcut("call(InvitationEmail.new(..))") )来“注入”一个模拟。 - @See Blog JMock and AspectJ Daniel Roop以及Spring Roo的@MockStaticEntityMethods(Mock Static Methods using Spring Aspect