AspectJ有什么用处?

50

首先,我想指出的是,我使用AspectJ并且很喜欢它,但是除此之外我还能用它做什么。

我知道AspectJ可以被用于日志记录。在某些情况下,它还被用于事务控制 - 通常与注释一起实现。AspectJ也可以用于(代码生成)方法增强类,例如Spring Roo所做的那样。

但我相信,AspectJ和AOP一般可以用于更多的场合,而不仅仅是:日志记录、事务控制以及模拟部分类。

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


2
你应该阅读Ramnivas Laddad的《AspectJ实战》http://www.manning.com/laddad2。目录会给你一个大致的了解:http://www.manning.com/laddad2/excerpt_contents.html。 - Sean Patrick Floyd
2
@George Stocker:这个问题有14个赞,0个踩,共有3个答案,总共有21个赞,而您在4年后将其暂停 - 真的吗?关键是这个问题有很好的答案,所以它实际上并没有“过于宽泛”的问题。 - Ralph
1
如果您想讨论闭包,请随时在元站上提出。将其关闭为过于宽泛与投票、浏览量或当前答案无关,而是与问题的范围有关。 - George Stocker
@George Stocke:我问了一个问题,关于什么是广泛和过于宽泛之间的界限 - http://meta.stackoverflow.com/questions/268305/what-is-an-indicator-that-a-question-is-too-broad-or-not - Ralph
2
又一个有价值的问题被认为太宽泛而关闭了... - Dave
3个回答

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

编辑

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

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

2
缓存是另一种用途。 - ex0b1t
谢谢,@ex0b1t。任何列表都永远不会完整。 - AlexR
方法开始时有很多空值检查怎么办? 例如: 我有一个带有方法doSmth(List<Objects> list, OtherClass otherparam)的接口。它将在许多类中实现。我需要在方法doSmth中检查参数是否为空,因为90%的实现接口的类都需要这样做。我应该使用方面吗? - HereAndBeyond

21

维基百科条目会给你更多例子(但并不是很多)。通常,面向方面的编程只应用于实现不属于类的核心关注点且适用于不同类的简单行为。一旦您开始在方面中放置过多逻辑,代码就变得非常难以阅读。

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


8

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

  • 例如,每个控制器方法都需要一些特殊的注释。
  • 每个服务/前端/DTO类必须位于服务/前端/DTO包中。
  • 更成熟的想法,如:检查setter没有任何逻辑

在类中注入Mock对象,否则将通过new创建新实例。假设您有以下代码:

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

需要将email替换为模拟值。然后,您可以使用Aspect (@Pointcut("call(InvitationEmail.new(..))"))来“注入”一个模拟对象。-- 请参阅Daniel Roop的JMock和AspectJ博客,以及Spring Roo的@MockStaticEntityMethods (使用Spring Aspect模拟静态方法)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接