【问题标题】:What is the big idea behind the AOP implementationAOP 实现背后的大思想是什么
【发布时间】:2012-06-13 17:38:07
【问题描述】:

我想对我说清楚。

我阅读了有关 AOP 概念的信息,我明白这是共享横切服务的好方法。 (日志记录、安全、事务...)

但我想对这个想法和它的实施说/问一些事情。

我读到有一些方法,如 AspectJ、JBOSS AOP,以便将 AOP 同化到我的业务逻辑中。

但它不是很久以前就在这里了吗?

假设我想在我的组件(Java bean、EJB'S 等等)之间共享一个日志记录或安全实现

为什么我不能创建一个 Singleton bean,以确保它只有一个实例,并且只要任何组件需要它的日志记录/安全服务,它就会查找并使用它的服务。

为什么我需要了解并拥有所有这些“大”实现,例如 aspectj 或 jboss AOP?我在这里想念什么?

【问题讨论】:

    标签: java design-patterns jakarta-ee aop aspectj


    【解决方案1】:

    你还没有理解 AOP 到底是什么。 AOP的思想就是能写

    public void foo() {
        // some business code
    }
    

    而不是写

    public void foo() {
        LogManager.getInstance().log("entering foo...");
        SecurityManager.getInstance().checkUserInRole("fooer");
        TransactionManager.getInstance().startTransaction();
        try {
            // some business code
            TransactionManager.getInstance().commit();
        }
        catch(RuntimeException e) {
            TransactionManager.getInstance().rollback();
            throw e;
        }
        LogManager.getInstance().log("leaving foo...");
    }
    

    所有横切关注点(日志记录、安全性、事务管理)都在业务代码之外,而不是与业务代码混在一起,并且反复令人作呕。

    【讨论】:

    • 但是您仍然需要告诉 AOP 逻辑您想在何时/何地使用这些服务。它如何知道我想要记录方法的进入/退出?或者如果我只是想在我的方法中间记录一些东西.. some1 需要告诉它去做。它无法读懂我的想法..
    • 这通常以声明方式完成,在配置文件中或使用 Java 注释。例如,Spring 允许使用@Transactional 标记方法。它还允许配置 AOP 拦截器以使类名以 ServiceImpl 结尾的所有 bean 的所有方法都具有事务性(这只是一个示例)。如果你需要在你的方法中间记录一些东西,那么 AOP 不会帮助你。
    • 所以我只将它用于日志记录/安全性.. 只是为了这个有点矫枉过正吗?除了您之前提到的 3 个之外,我还有更多可以使用 AOP 的解决方案吗?
    • @rayman:从我的脑海中浮现:事务、安全、日志记录、性能监控、分析、错误处理、同步、节流(API)——可能还有很多其他的。是的,仅将 AspectJ 用于日志记录可能是一种矫枉过正
    • 老实说,如果我使用 EJB 的大部分东西已经内置在方面,他们呢?
    【解决方案2】:

    AOP 的想法是将通用逻辑保存在一个地方(您的单例解决方案也可以解决)并且“不可见”(透明)。使用 AOP,您的日志记录代码甚至不是业务逻辑的一部分,而是在幕后“注入”的。

    而且它更加动态 - 您无需在每次需要记录时都调用单例服务。只需配置一次切入点(例如:“此包中的所有设置器”),日志记录将应用于所有现有代码和新代码。

    此外,AOP 更加灵活和强大。您可以询问 AOP 实现:“请在我每次调用以“save*”开头并接受一个参数的方法时启动事务”或“如果返回 Customer 的方法抛出从 IllegalAgumentException 子类化的异常,则调用该方法再次”。

    AOP 不仅仅是对通用逻辑进行分组。

    【讨论】:

    • 如果我创建父类并扩展我的类会从它扩展。我可以把我所有的“perment”逻辑放在那个父类中。当一个类扩展它时,它将能够享受我之前声明的所有 loggig/secutiry... 方法。我还可以为 perment loggig 等创建其他方法“create”/“destroy”..
    • @rayman:但您仍然需要显式地调用这些方法(参见出色的代码示例JB Nizet)。一旦得到指示,AOP 会为您完成,也为您尚未编写的代码执行此操作!这也意味着新程序员将在不知道它们的情况下享受日志记录/安全功能。更不用说你没有用基类/帮助方法弄乱你的代码
    • 你可以看看我对 JB 的最后评论。
    猜你喜欢
    • 2011-07-14
    • 1970-01-01
    • 1970-01-01
    • 2014-06-09
    • 1970-01-01
    • 1970-01-01
    • 2012-03-15
    • 2023-03-12
    • 2021-12-22
    相关资源
    最近更新 更多