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.
-
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). -
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.
-
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.
-
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.
-
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.) -
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 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.
-
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 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 returning advice: Advice to be run after a join point completes normally (for example, if a method returns without throwing an exception).
-
After throwing advice: Advice to be run if a method exits by throwing an exception.
-
After (finally) advice: Advice to be run regardless of the means by which a join point exits (normal or exceptional return).
-
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).