AOP实施背后的重要思想是什么?

时间:2012-06-10 14:34:03

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

我想为我说清楚。

我读到了AOP概念,我明白这是分享跨领域服务的好方法。 (记录,安全,交易......)

但我想说/询问一下这个想法及其实施情况。

我读过像AspectJ,JBOSS AOP这样的方法,以便将AOP同化为我的业务逻辑。

但很久以前不是这里的吗?

比方说,我想在我的组件(Java bean,EJB',无论如何......)之间共享日志记录或安全实现。

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

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

2 个答案:

答案 0 :(得分:9)

AOP的想法是将共同逻辑保持在一个地方(你的单身解决方案也解决了)是“不可见的”(透明)。使用AOP,您的日志记录代码甚至不是业务逻辑的一部分,它会在幕后“注入”。

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

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

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

答案 1 :(得分:6)

你还没有明白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...");
}

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