AOP从何而来
技术的演化从来都不是随机现象。往往都是为了应对某种特定的问题,而形成的一系列切实可行解决方案或者优雅的最佳实践,然后把它们汇聚在一起,就形成了一个工具,一个库或者是一个框架。
为应对Cross-cutting问题而生
要了解AOP(Aspect Oriented Programming,面向切面编程)从何而来,首先来看看下面这段代码:
public void doBusinessLogic() {
logger.trace("进入 " + CLASS_NAME + "." + METHOD_NAME); TransactionStatus tx = transactionManager.getTransaction(new DefaultTransactionDefinition());
try {
// 开始执行业务逻辑
// ......
// 业务逻辑结束
} catch (Exception e) {
logger.error("异常 " + CLASS_NAME + "." + METHOD_NAME, e);
tx.setRollbackOnly();
throw e;
} finally {
transactionManager.commit(tx);
logger.trace("退出 " + CLASS_NAME + "." + METHOD_NAME);
}
}
发现上面这段代码有什么问题了吗?很明显,样板代码(Boilerplate)太多了,真正重要的业务逻辑反而只占了很小的一部分(如果执行的业务逻辑比较简单的话)。这种代码结构合理吗?显然不合理。上述的样板代码还只包含了简单的Tracing,Transaction以及Exception处理,如果还需要更多的这类处理,那么代码将臃肿不堪。
所以,为了处理这类公用需求,最大程度地避免重复代码而遵循DRY原则。AOP应运而生。那么AOP要解决一个什么问题呢?

上面这张图能够说明要解决的问题。
每种颜色的代码就相当于公用的需求点,比如绿色的Tracing,蓝色的Transaction以及红色的Exception Handling。这些代码存在于不止一个类中,通常而言是分散的到处都是,就像上面的那段代码一样。
而这些重复而通用的代码就是AOP要解决的问题,每一个共同的横切关注点(Cross-cutting Concern)对应于一个切面(Aspect)。这些切面的目的就是将四处散落的通用代码集中管理,然后采用声明式的方式将这些代码再注入到需要执行的位置。
AOP概述
Aspect, Advice以及Pointcut的关系。
那么,什么是切面(Aspect)呢?
回顾一下上面的那张示意图。里面表达了切面的两个要素:
- 执行什么,比如Tracing亦或是Transaction
- 在哪执行,比如是在Class A还是Class B
那么反映到AOP的概念中,这两个要素分别对应的是Advice以及Pointcut。
所以,简而言之:Aspect = Advice(做什么) + Pointcut(在哪做)
比如对于上面的Tracing功能而言:
- Advice - 执行Logging相关操作
- Pointcut - 在方法的开始和结束处执行

本文介绍了AOP(面向切面编程)的由来,为解决跨切面问题而诞生。文章详细阐述了AOP的核心概念,包括Aspect、Advice和Pointcut,并提供了使用示例。此外,还讲解了Advice的五种类型:Before、After、Around、After Returning和After Throwing,以及如何在Spring工程中启用AOP。
最低0.47元/天 解锁文章
1477

被折叠的 条评论
为什么被折叠?



