AOP Concepts

让我们从定义一些主要的 AOP 概念和术语开始。这些术语不特定于 Spring。遗憾的是,AOP 术语并不特别直观。然而,如果 Spring 使用自己的术语,那就更令人困惑了。

Let us begin by defining some central AOP concepts and terminology. These terms are not Spring-specific. Unfortunately, AOP terminology is not particularly intuitive. However, it would be even more confusing if Spring used its own terminology.

  • 切面:一个跨越多个类的关注点的模块化。事务管理是企业 Java 应用程序中横切关注点的典例。在 Spring AOP 中,切面是通过使用常规类(schema-based approach)或注释了 @Aspect 注释的常规类(@AspectJ style)来实现的。

  • Aspect: A modularization of a concern that cuts across multiple classes. Transaction management is a good example of a crosscutting concern in enterprise Java applications. In Spring AOP, aspects are implemented by using regular classes (the schema-based approach) or regular classes annotated with the @Aspect annotation (the @AspectJ style).

  • 连接点:程序执行期间某一时刻,例如方法的执行或异常的处理。在 Spring AOP 中,连接点始终表示方法执行。

  • Join point: A point during the execution of a program, such as the execution of a method or the handling of an exception. In Spring AOP, a join point always represents a method execution.

  • 建议:切面在特定连接点上执行的操作。不同类型的建议包括“around”、“before”和“after”建议。(建议类型将在后面讨论。)许多 AOP 框架(包括 Spring)将建议建模为拦截器,并在连接点周围维护一个拦截器链。

  • Advice: Action taken by an aspect at a particular join point. Different types of advice include "around", "before", and "after" advice. (Advice types are discussed later.) Many AOP frameworks, including Spring, model an advice as an interceptor and maintain a chain of interceptors around the join point.

  • 切入点:与连接点匹配的谓词。建议与切入点表达式关联,并在切入点表达式匹配的任何连接点上运行(例如,执行具有特定名称的方法)。由切入点表达式匹配连接点这一概念是 AOP 的核心,Spring 默认使用 AspectJ 切入点表达式语言。

  • Pointcut: A predicate that matches join points. Advice is associated with a pointcut expression and runs at any join point matched by the pointcut (for example, the execution of a method with a certain name). The concept of join points as matched by pointcut expressions is central to AOP, and Spring uses the AspectJ pointcut expression language by default.

  • 引介:代表类型声明附加方法或字段。Spring AOP 允许您向任何建议的对象引入新接口(及其对应的实现)。例如,您可以使用引介,使 bean 实现 IsModified 接口,以简化缓存。(在 AspectJ 社区中,引介被称为类型间声明。)

  • Introduction: Declaring additional methods or fields on behalf of a type. Spring AOP lets you introduce new interfaces (and a corresponding implementation) to any advised object. For example, you could use an introduction to make a bean implement an IsModified interface, to simplify caching. (An introduction is known as an inter-type declaration in the AspectJ community.)

  • 目标对象:正在被一个或多个切面建议的对象。也称为“建议对象”。由于 Spring AOP 是通过使用运行时代理实现的,因此此对象始终是一个代理对象。

  • Target object: An object being advised by one or more aspects. Also referred to as the "advised object". Since Spring AOP is implemented by using runtime proxies, this object is always a proxied object.

  • AOP 代理:AOP 框架创建的对象,用于实现切面契约(建议方法执行等)。在 Spring 框架中,AOP 代理是 JDK 动态代理或 CGLIB 代理。

  • AOP proxy: An object created by the AOP framework in order to implement the aspect contracts (advice method executions and so on). In the Spring Framework, an AOP proxy is a JDK dynamic proxy or a CGLIB proxy.

  • 编织:将切面与其他应用程序类型或对象链接起来,以创建建议对象。这可以在编译时(例如,使用 AspectJ 编译器)、加载时或运行时完成。Spring AOP(与其他纯 Java AOP 框架一样)在运行时执行编织。

  • Weaving: linking aspects with other application types or objects to create an advised object. This can be done at compile time (using the AspectJ compiler, for example), load time, or at runtime. Spring AOP, like other pure Java AOP frameworks, performs weaving at runtime.

Spring AOP 包括以下类型的通知:

Spring AOP includes the following types of advice:

  • Before 建议:在连接点之前运行的建议,但它无法阻止执行流继续到该连接点(除非抛出异常)。

  • Before advice: Advice that runs before a join point but that does not have the ability to prevent execution flow proceeding to the join point (unless it throws an exception).

  • After 返回建议:在连接点正常完成之后运行的建议(例如,如果方法返回而不抛出异常)。

  • After returning advice: Advice to be run after a join point completes normally (for example, if a method returns without throwing an exception).

  • After 抛出建议:在方法通过抛出异常而退出时运行的建议。

  • After throwing advice: Advice to be run if a method exits by throwing an exception.

  • After(finaly)建议:无论连接点退出方式(正常或异常返回)如何,都要运行的建议。

  • After (finally) advice: Advice to be run regardless of the means by which a join point exits (normal or exceptional return).

  • Around 建议:环绕连接点(如方法调用)的建议。这是建议中最强大的类型。Around 建议可以在方法调用之前和之后执行自定义行为。它还负责选择继续到连接点,还是通过返回自己的返回值或抛出异常来捷径建议的方法执行。

  • Around advice: Advice that surrounds a join point such as a method invocation. This is the most powerful kind of advice. Around advice can perform custom behavior before and after the method invocation. It is also responsible for choosing whether to proceed to the join point or to shortcut the advised method execution by returning its own return value or throwing an exception.

Around 通知是最通用的通知类型。由于 Spring AOP 与 AspectJ 一样提供了全系列的通知类型,我们建议你使用可实现所需行为的最不强大的通知类型。例如,如果你只需要使用一个方法的返回值更新一个缓存,那么你最好实现一个 after-returning 通知,而不是一个 around 通知,尽管一个 around 通知也可以实现相同的事情。使用最具体的通知类型提供了一个更简单的编程模型,并且出错的可能性更小。例如,你不需要对用于 around 通知的 JoinPoint 调用 proceed() 方法,因此,你无法调用它。

Around advice is the most general kind of advice. Since Spring AOP, like AspectJ, provides a full range of advice types, we recommend that you use the least powerful advice type that can implement the required behavior. For example, if you need only to update a cache with the return value of a method, you are better off implementing an after returning advice than an around advice, although an around advice can accomplish the same thing. Using the most specific advice type provides a simpler programming model with less potential for errors. For example, you do not need to invoke the proceed() method on the JoinPoint used for around advice, and, hence, you cannot fail to invoke it.

所有通知参数都是静态类型的,因此你可以使用适当类型(例如,方法执行的返回值类型)的通知参数,而不是 Object 数组。

All advice parameters are statically typed so that you work with advice parameters of the appropriate type (e.g. the type of the return value from a method execution) rather than Object arrays.

匹配切点的连接点概念是 AOP 的关键,它区别于仅提供拦截的旧技术。切点使通知能够独立于面向对象层次结构进行定位。例如,你可以应用一个提供声明式事务管理的 around 通知,该通知跨越多个对象(比如服务层中的所有业务操作)的一组方法。

The concept of join points matched by pointcuts is the key to AOP, which distinguishes it from older technologies offering only interception. Pointcuts enable advice to be targeted independently of the object-oriented hierarchy. For example, you can apply an around advice providing declarative transaction management to a set of methods that span multiple objects (such as all business operations in the service layer).