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

ray*_*man 6 java aop design-patterns aspectj java-ee

我想向我说清楚.

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

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

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

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

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

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

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

Tom*_*icz 9

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

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

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

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


JB *_*zet 6

你还没有明白AOP是什么.AOP的想法是能够写

public void foo() {
    // some business code
}
Run Code Online (Sandbox Code Playgroud)

而不是写作

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...");
}
Run Code Online (Sandbox Code Playgroud)

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