AspectJ 有什么用?

发布于 2024-10-05 08:07:32 字数 1436 浏览 7 评论 0原文

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

永不分离 2024-10-12 08:07:45

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

  • 就像每个控制器方法都需要一些特殊的注释一样,
  • 每个 service/frontend/dto 类必须位于 service/fronten/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 的模拟静态方法方面)

One can use AspectJ for enforcing some (design) rules.


Inject Mocks in classes that otherwise would create new instances by using new.
Assume you have this code:

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

And need to replace email by an mock. Then you could use an Aspect (@Pointcut("call(InvitationEmail.new(..))")
) to "inject" a mock. -- @See Blog JMock and AspectJ by Daniel Roop, as well as Spring Roo`s @MockStaticEntityMethods (Mock Static Methods using Spring Aspect)

最终幸福 2024-10-12 08:07:43

Wikipedia 条目 为您提供了更多示例(但不是很多)。通常,面向方面的编程应该仅用于实现不属于类的核心关注点并且对于不同类来说是公共的简单行为。一旦你开始在方面放入太多逻辑,代码就会变得非常难以阅读。

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

The Wikipedia entry gives you a few more examples (but not that many). Typically, Aspect Oriented Programing should be use only to implement simple behaviours that are not part of core concern of a class and are common to different classes. As soon as you begin to put too much logic in your aspects, the code becomes really unreadable.

The aspect you suggest (logging, transaction, ...) are the most commonly used. I would add security as well.

若沐 2024-10-12 08:07:37
  • 权限检查
  • 中断操作需要太长时间
  • 在单独的线程中运行操作,甚至在其他机器上的不同进程或事件的上下文中
  • 监视
  • 在调用之前准备任何数据/环境并在调用
  • 打开/关闭资源

后处理结果编辑

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

  • 安全检查。
  • 修复您无法更改的 API 的错误或行为。例如,在某些情况下返回 false 的布尔方法,但应返回 true。您可以使用 AspectJ 修复此问题。
  • permission check
  • interrupt action that takes too long
  • run action in separate thread or even in context of different process or event on other machine
  • monitoring
  • preparing any data / environment before call and processing results after call
  • opening / closing resources

EDIT

Although many years passed since I gave this answer I decided to add the following to make the answer more complete.

  • security check.
  • fixes of incorrect or behavior of API that you cannot change. For example boolean method that returns false in some conditions but should return true. You can fix this using AspectJ.
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文