46

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

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

但我相信 AspectJ 和 AOP 总体上可以用于以下方面:日志记录、事务控制和模拟部分类。

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

4

3 回答 3

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

编辑

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

  • 安全检查。
  • 修复您无法更改的 API 不正确或行为。例如false在某些条件下返回但应该返回的布尔方法true。您可以使用 AspectJ 解决此问题。
于 2010-11-30T12:48:05.070 回答
20

维基百科条目为您提供了更多示例(但不是那么多)。通常,面向方面的编程应该只用于实现不属于类核心关注的部分并且对不同类通用的简单行为。一旦你开始在你的切面中加入过多的逻辑,代码就会变得非常不可读。

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

于 2010-11-30T12:43:28.637 回答
7

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

  • 就像每个控制器方法都需要一些特殊的注释
  • 每个 service/frontend/dto 类都必须位于 service/fronten/dto 包中
  • 更成熟的想法是:检查 setter 是否没有任何逻辑

在类中注入 Mocks,否则会使用 new 创建新实例。假设您有以下代码:

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

并且需要用email模拟替换。然后您可以使用 Aspect ( @Pointcut("call(InvitationEmail.new(..))") ) 来“注入”模拟。-- @See博客 JMock 和Daniel Roop 的 AspectJ,以及 Spring Roo 的 @MockStaticEntityMethods(使用 Spring Aspect 模拟静态方法

于 2011-05-02T12:06:49.543 回答