可能的AOP使用场景是什么?

64

我希望能够概括出AOP在应用程序设计中的有效参与可能情况。目前我所了解到的包括:

  • 与日志相关
  • 安全检查
  • 事务管理
  • 对传统应用程序进行调整

还有其他的吗?

(不一定是基于Spring代理的AOP,也可以是JBoss AOP。)

(相关问题)


2
“可能的情况”?那几乎是一个无限的集合。 然而,并非所有情况都是好主意。但是所有情况都是可能的。有没有办法缩小或聚焦这个问题? - S.Lott
1
请仔细阅读:问题中包含“在应用程序设计中有效使用AOP的可能情况”。我的意思是,在这些情况下使用AOP是一个好主意。如果问题不清楚,我很抱歉。 - Ondra Žižka
应该是社区维基。 - skaffman
“有效参与”似乎是一个简单列举AOP可以使用的所有可能方式的邀请。 “有效”是一个模糊的术语,如果没有某种限定或过滤,最愚蠢的AOP技术也可以被AOP粉丝称为“有效”。 - S.Lott
11个回答

34

我可以给你两个使用AOP的例子:

  • 自动注册JMX远程管理对象。如果一个类被我们的@AutoRegister注解所注释,那么我们有一个切面来监视该类的新实例化并自动将其注册到JMX。

  • 审计日志(AOP最佳实践)。 方法是在表示可审计操作的方法上进行注解。与Spring Security等组件结合使用,我们可以很好地了解:

    • 用户是谁
    • 他们正在调用哪个方法
    • 他们提供的数据
    • 方法被调用的时间
    • 调用是否成功(即是否抛出异常)

AOP 可以用于业务代码吗?假设我有一个 Presenter,你可以将视图设置为它或不设置(MVP)。那么我不想在每次调用视图时都检查视图是否为空,我能在任何调用视图方法之前处理这个空值检查吗? - Amir Ziarati
@Kevin:在这种情况下,你如何处理审计失败?如果它抛出任何异常,甚至是像除以零、空指针异常这样的微不足道的异常,你会标记审计失败吗? - Gaurav

15
  • 异常处理:无需重复糟糕的try...catch,catch,catch等列表 - 这也意味着异常处理得到了保证的一致性。
  • 性能监控:非常有用,因为使用方面是非侵入式的,可以在事后完成,然后在不再需要时关闭。

哇...... 10年前...... AOP没有多少东西...... 这里还有几个:

  • 能够自定义对象,在没有访问其构造函数的情况下(例如jpa实体)
  • 实施安全规则(安全性表示用户不允许调用此方法 - AOP可以实现)
  • 事务管理器(开始,提交,回滚)
  • 缓存 - 想要缓存方法的结果而不是再次调用它

7
为了了解AOP的适用性覆盖范围,我真的建议您阅读这本书Aspect-Oriented-Software-Development-Use-Cases。该书详细阐述了使用AOP处理功能和非功能需求的用例。在阅读之后,您将会发现切面可以用于更多的需求,而不仅仅是日志记录、跟踪、安全等方面。

6

方法级缓存,如果您的方法是无状态的(即使用相同参数值重复调用时返回相同的值)。这在DAO方法中更加有效,因为它避免了对数据库的访问。


5
  • 读/写锁。我使用了一个切面来定义需要读锁或独占锁的方法,而不是复制相同的代码片段。

5
我们使用它来进行软件许可证管理,即仅允许软件在计算机上运行,如果安装了某些特定的许可证。这与您列出的用途并没有太大不同,因为它是一种安全检查形式。
我发布了一篇博客文章,描述了一个实际的实现在这里

4

1

我还会为以下方面提供建议:

  • 异步方法调用
  • 监控

使用Spring和tcServer(开发者版),您可以轻松监控所有带有@Component注释的Spring bean。您可以查看所用时间,输入和返回数据以及异常情况。


1

INotifyPropertyChanged和类似的恐怖。

基本上,无论在哪里有像这样的代码 - 使用一个方面,你就完成了。


1

运行时检查代码契约。.NET的代码契约使用AOP进行

运行时检查。我们的二进制重写器通过注入契约来修改程序,这些契约在程序执行时进行检查。


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