[[aop-introduction-defn]]
= AOP Concepts

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 xref:core/aop/schema.adoc[schema-based approach]) or regular classes annotated with the
  `@Aspect` annotation (the xref:core/aop/ataspectj.adoc[@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 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 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.

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

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).
