AspectJ有什么用?

时间:2010-11-30 12:34:24

标签: java aspectj aop aspects

首先让我注意一下,我使用AspectJ,我喜欢它,但我还能用它做什么。

我知道AspectJ可以/用于记录。在某些情况下,它用于事务控制 - 主要与注释一起实现。 AspectJ也可用于使用(代码生成的)方法增强类,如Spring Roo。

但我相信AspectJ和AOP一般可用于:日志记录,事务控制和模拟部分类。

那么AspectJ和AOP的其他有用用例是什么?

3 个答案:

答案 0 :(得分:32)

  • 权限检查
  • 中断行动需要太长时间
  • 在单独的线程中运行操作,甚至在其他机器上的不同进程或事件的上下文中运行
  • 监测
  • 在通话前准备任何数据/环境并在通话后处理结果
  • 开启/关闭资源

修改

虽然自从我给出这个答案已经很多年了,但我决定添加以下内容以使答案更加完整。

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

答案 1 :(得分:19)

Wikipedia entry为您提供了更多示例(但不是很多)。通常,面向方面编程应该仅用于实现不属于类的核心关注的简单行为,并且对于不同的类是通用的。一旦你开始在你的方面放置太多的逻辑,代码变得非常难以理解。

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

答案 2 :(得分:5)

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


在类中注入Mocks,否则将使用new创建新实例。 假设你有这个代码:

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

需要用模拟替换email。然后你可以使用一个Aspect(@Pointcut("call(InvitationEmail.new(..))") )来“注入”一个模拟。 - @参见Daniel Roop的Blog JMock and AspectJ,以及Spring Roo的@MockStaticEntityMethods(Mock Static Methods using Spring Aspect