AOP实现背后的主要思想是什么?

6

我希望你能够帮我澄清一下。

我阅读了有关AOP概念的文章,并且了解到这是一种共享交叉服务(例如日志记录、安全、事务等)的好方法。

但是我想就这个想法及其实现提出一些问题/建议。

我阅读到有一些方式,如AspectJ、JBOSS AOP,可以将AOP融入我的业务逻辑中。

但这不是很早之前就已经存在了吗?

例如,我想在我的组件(Java bean、EJB等)之间共享日志记录或安全实现,为什么我不能制作一个单例bean,确保它只有一个实例,并且只要任何组件需要它的日志记录/安全服务,它就会查找并使用该服务呢?

我为什么需要理解所有那些“大”实现,例如aspectj或jboss AOP呢?我在这里错过了什么吗?

2个回答

9
AOP的理念在于将通用逻辑放在一个地方(你的单例解决方案也可以实现),并且保持“不可见”(透明)。使用AOP,你的日志代码甚至不是业务逻辑的一部分,而是“注入”到幕后。
此外,它更加动态 - 你不需要每次都调用单例服务来进行日志记录。只需配置一次切入点(例如:“这个包中的所有setter”),即可为所有现有和新代码应用日志记录。
此外,AOP更加灵活和强大。你可以请求AOP实现:“每次我调用以“save *”开头且带有一个参数的方法时,请启动一个事务”,或者“如果返回Customer的方法抛出从IllegalAgumentException子类继承的异常,则再次调用该方法”。
AOP远不止于将通用逻辑分组。

如果我创建一个父类并让我的其他类继承它,那会怎么样呢?我可以在这个父类中放置所有的“永恒”的逻辑。当一个类继承它时,它将能够享受我之前声明的所有日志/安全等方法。我还可以为永久记录和其他操作创建额外的方法,如“create”/“destroy”。 - rayman
@rayman: 但你仍然需要显式地调用这些方法(请参见伟大的代码示例JB Nizet)。一旦指示,AOP将为您执行此操作,即使是您尚未编写的代码!这也意味着新的程序员将享受日志记录/安全功能,而甚至不知道它们的存在。更不用说您不会用基础类/帮助方法来混淆您的代码了。 - Tomasz Nurkiewicz
也许你可以看一下我给JB的最后一条评论。 - rayman

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...");
}

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


但是你仍然需要告诉AOP逻辑何时/在哪里使用这些服务,它怎么知道我想要记录方法的进入/退出?或者如果我只想在我的方法中间记录.debug什么,就有人需要告诉它去做。它不能读我的心思。 - rayman
通常这是通过声明式方式完成的,可以在配置文件或使用Java注解中实现。例如,Spring允许使用@Transactional标记方法。它还允许配置AOP拦截器,使所有类名以ServiceImpl结尾的bean的所有方法都具有事务性(这只是一个例子)。如果您需要在方法执行过程中记录某些内容,则AOP无法帮助您。 - JB Nizet
那么,我将仅将其用于日志记录/安全性。仅仅为此使用它是否有点过度?除了之前提到的3个解决方案,我还能用AOP做更多的事情吗? - rayman
1
@rayman:从我的角度来看,包括事务、安全、日志记录、性能监控、分析、错误处理、同步、限流(API)等等。当然,仅仅为了日志记录而使用AspectJ可能有些过头了。 - Tomasz Nurkiewicz
是的。EJB 使用 AOP 实现声明性事务、声明性安全等,这些功能开箱即用。 - JB Nizet
显示剩余2条评论

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