6

我想对我说清楚。

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

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

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

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

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

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

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

4

2 回答 2

9

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

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

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

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

于 2012-06-10T14:42:13.103 回答
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...");
}

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

于 2012-06-10T14:45:58.153 回答