AOP 概念
让我们从定义一些核心的 AOP 概念和术语开始。这些术语不是 特定于 Spring。遗憾的是,AOP 术语并不是特别直观。 但是,如果 Spring 使用自己的术语,那将更加令人困惑。
-
Aspect:跨多个类的关注点的模块化。 事务管理是企业 Java 中横切关注点的一个很好的例子 应用。在 Spring AOP 中,切面是使用常规类实现的 (基于架构的方法)或带有注释注释的常规类(@AspectJ样式)。
@Aspect
-
连接点:程序执行过程中的一个点,例如执行 方法或异常的处理。在 Spring AOP 中,连接点始终是 表示方法执行。
-
Advice:一个 aspect 在特定连接点采取的行动。不同类型的 建议包括 “around”、“before” 和 “after” 建议。(讨论了建议类型 稍后。许多 AOP 框架,包括 Spring,将通知建模为拦截器,并且 在 Join Point 周围维护一个拦截器链。
-
切入点:与连接点匹配的谓词。建议与 pointcut 表达式并在与该 pointcut 匹配的任何连接点(例如 执行具有特定名称的方法)。匹配连接点的概念 by pointcut 表达式是 AOP 的核心,而 Spring 使用 AspectJ pointcut 表达式语言。
-
简介:代表类型声明其他方法或字段。Spring AOP 允许您将新接口(和相应的实现)引入到任何 advised 对象。例如,你可以使用 introduction 使 bean 实现一个接口,以简化缓存。(引言称为 inter-type 声明。
IsModified
-
Target object:由一个或多个方面通知的对象。也称为 “Advised Object” 的 Visd 对象。由于 Spring AOP 是使用运行时代理实现的,因此 object 始终是代理对象。
-
AOP proxy:由 AOP 框架创建的对象,用于实现 aspect 合约(通知方法执行等)。在 Spring 框架中,AOP 代理 是 JDK 动态代理或 CGLIB 代理。
-
编织:将方面与其他应用程序类型或对象链接起来,创建一个 advised 对象。这可以在编译时完成(使用 AspectJ 编译器,用于 example)、load time 或 runtime 中。Spring AOP 与其他纯 Java AOP 框架一样, 在运行时执行 weaving。
Spring AOP 包括以下类型的建议:
-
Before advice:在连接点之前运行但没有 防止执行流继续到连接点的能力(除非它抛出 一个例外)。
-
After returning advice:在连接点完成后运行的通知 通常(例如,如果方法返回而不引发异常)。
-
抛出后通知:如果方法通过抛出 例外。
-
After (finally) advice:无论 连接点退出 (正常或异常返回)。
-
Around advice:围绕连接点的建议,例如方法调用。 这是最有力的建议。Around advice 可以执行自定义行为 方法调用之前和之后。它还负责选择是否 继续执行连接点,或者通过返回其 自己的返回值或引发异常。
围绕建议是最普遍的建议。从 Spring AOP 开始,就像 AspectJ 一样,
提供了全系列的建议类型,我们建议你使用最弱的
advice 类型。例如,如果您只需要
使用方法的返回值更新 Cache,则最好实现
返回 advice 后比 around 建议,虽然 around 建议可以完成
同样的事情。使用最具体的 Advice 类型提供更简单的编程模型
出错的可能性较小。例如,您不需要调用 used for around 通知上的方法,因此,您不能不调用它。proceed()
JoinPoint
所有通知参数都是静态类型的,因此您可以使用
适当的类型(例如,方法执行的返回值的类型),而不是
than 数组。Object
由切入点匹配的连接点的概念是 AOP 的关键,它区分了 它来自仅提供拦截的旧技术。切入点使建议成为 独立于面向对象的层次结构进行定位。例如,您可以应用 around advice 为一组跨 多个对象(例如服务层中的所有业务操作)。