AspectJ有什么用?

Ral*_*lph 41 java aop aspectj aspects

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

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

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

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

Ale*_*exR 35

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

编辑

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

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

  • 缓存是另一种用途 (2认同)

Gui*_*ume 19

维基百科条目给你一些例子(但不是很多).通常,面向方面编程应该仅用于实现不属于类的核心关注的简单行为,并且对于不同的类是通用的.一旦你开始在你的方面放置太多的逻辑,代码变得非常难以理解.

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


Ral*_*lph 5

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

  • 像每个控制器方法都需要一些特殊的注释
  • 每个服务/前端/ dto类必须位于service/fronten/dto pacakge中
  • 更成熟的想法是:检查安装者没有任何逻辑.

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

public void sendInvitationEmail(String address) {
    InvitationEmail email = new InvitationEmail();
    email.sendTo(address).send();
}
Run Code Online (Sandbox Code Playgroud)

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