# Spring AOP 教程示例

> 原文： [https://howtodoinjava.com/spring-aop-tutorial/](https://howtodoinjava.com/spring-aop-tutorial/)

在本 **Spring AOP 教程**中，通过示例学习什么是面向切面的编程。 还通过示例了解什么是建议，连接点和切入点表达式以及如何在 Spring 应用程序中使用它们。

## 1\. Spring AOP – 简介

Spring AOP 支持在 Spring 应用程序中进行面向切面的编程。 在 AOP 中，各个切面可以实现关注点的模块化，例如事务管理，日志记录或跨多个类型和对象的安全性（通常称为**跨切点关注点**）。

AOP 提供了一种使用简单的可插拔配置在实际逻辑之前，之后或周围动态添加横切关注点的方法。 现在和现在，维护代码都很容易。 您只需更改配置文件即可添加/删除关注点，而无需重新编译完整的源代码（如果您要使用要求 XML 配置的切面）。

## 2\. 什么是建议，连接点和切入点

1.  AOP 中的一个重要术语是**建议**。 它是**切面**在特定连接点处采取的操作。
2.  **连接点**是程序的执行点，例如方法的执行或异常的处理。 在 Spring AOP 中，连接点始终代表方法的执行。
3.  **切入点**是与连接点匹配的谓词或表达式。
4.  **建议**与切入点表达式关联，并在与该切入点匹配的任何连接点处运行。
5.  Spring 默认使用 AspectJ 切入点表达语言。

![Spring AOP](img/319c53497c1d373152a44b8e2976eec5.jpg)

Spring AOP

## 3\. AOP 建议的类型

Spring AOP 中有五种建议。

1.  **事前建议**：在连接点之前执行的建议，但是它不能阻止执行流程前进到连接点（除非它抛出异常）。
2.  **返回后建议**：在连接点正常完成后要执行的建议：例如，如果某个方法返回而没有抛出异常。
3.  **抛出后建议**：如果方法因抛出异常而退出，则要执行的建议。
4.  **事后建议**：无论连接点退出的方式如何（正常或特殊返回），都将执行建议。
5.  **周围建议**：围绕连接点的建议，例如方法调用。 这是最有力的建议。 周围建议可以在方法调用之前和之后执行自定义行为。 它还负责选择是返回连接点还是通过返回其自身的返回值或抛出异常来捷径建议的方法执行。

## 4\. Spring AOP 示例

#### 4.1. Maven 依赖

在编写任何代码之前，您将需要将 Spring AOP 依赖项导入到您的项目中。

`pom.xml`

```java
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>4.1.4.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>4.1.4.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aop</artifactId>
    <version>4.1.4.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjrt</artifactId>
    <version>1.6.11</version>
</dependency>
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.6.11</version>
</dependency>

```

#### 4.2. 切面和切入点表达式

编写使用`@Aspect`注解注解的切面类，并编写切入点表达式以匹配连接点方法。

`EmployeeCRUDAspect.java`

```java
@Aspect
public class EmployeeCRUDAspect {

    @Before("execution(* EmployeeManager.getEmployeeById(..))")			//point-cut expression
    public void logBeforeV1(JoinPoint joinPoint)
    {
        System.out.println("EmployeeCRUDAspect.logBeforeV1() : " + joinPoint.getSignature().getName());
    }
}

```

#### 4.3. 方法（连接点）

编写要在其上执行建议并与切入点表达式匹配的方法。

`EmployeeManager.java`

```java
@Component
public class EmployeeManager
{
    public EmployeeDTO getEmployeeById(Integer employeeId) {
        System.out.println("Method getEmployeeById() called");
        return new EmployeeDTO();
    }
}

```

在上面的示例中，`logBeforeV1()`将在 `getEmployeeById()`方法之前执行，**因为它与连接点表达式匹配**。

#### 4.4. 运行应用程序

运行该应用程序并查看控制台。

`TestAOP.java`

```java
ublic class TestAOP
{
    @SuppressWarnings("resource")
    public static void main(String[] args) {

        ApplicationContext context = new ClassPathXmlApplicationContext
        					("com/howtodoinjava/demo/aop/applicationContext.xml");

        EmployeeManager manager = context.getBean(EmployeeManager.class);

        manager.getEmployeeById(1);
    }
}

```

程序输出：

`Console`

```java
EmployeeCRUDAspect.logBeforeV1() : getEmployeeById
Method getEmployeeById() called

```

Spring aop 初学者教程，并带有示例。

## 5\. Spring AOP XML 配置示例

1.  [**Spring AOP AspectJ XML 配置示例**](https://howtodoinjava.com/spring/spring-aop/spring-aop-aspectj-xml-configuration-example/)

    学习使用 XML 配置来配置 AOP 切面。

2.  [**Spring AOP 事前建议示例**](https://howtodoinjava.com/spring/spring-aop/aspectj-before-advice-example/)

    学习使用`<aop:before/>`配置事前建议 AOP 切面。

3.  [**Spring AOP 返回后建议示例**](https://howtodoinjava.com/spring/spring-aop/aspectj-after-returning-advice-example/)

    学习使用`<aop:after-returning/>`配置返回后建议 AOP 切面。

4.  [**Spring AOP 抛出后建议示例**](https://howtodoinjava.com/spring/spring-aop/aspectj-after-throwing-advice-example/)

    学习使用`<aop:after-throwing/>`配置抛出后建议 AOP 切面。

5.  [**Spring AOP 事后建议示例**](https://howtodoinjava.com/spring/spring-aop/aspectj-after-advice-example/)

    学习使用`<aop:after/>`配置事后建议 AOP 切面。

6.  [**Spring AOP 周围建议示例**](https://howtodoinjava.com/spring/spring-aop/aspectj-around-advice-example/)

    学习使用`<aop:around/>`配置围绕建议 AOP 切面。

## 6\. Spring AOP AspectJ 注解示例

1.  [**Spring AOP AspectJ 注解配置示例**](https://howtodoinjava.com/spring/spring-aop/spring-aop-aspectj-example-tutorial-using-annotation-config/)

    学习使用 aspectj 注解配置来配置 AOP 切面。

2.  [**Spring AOP AspectJ `@Before`示例**](https://howtodoinjava.com/spring/spring-aop/aspectj-before-annotation-example/)

    学习使用`@Before`注解配置事前建议 AOP 切面。

3.  [**Spring AOP AspectJ `@After`示例**](https://howtodoinjava.com/spring/spring-aop/aspectj-after-annotation-example/)

    学习使用`@After`注解配置事后建议 AOP 切面。

4.  [**Spring AOP AspectJ `@Around`示例**](https://howtodoinjava.com/spring/spring-aop/aspectj-around-annotation-example/)

    学习使用`@Around`注解围绕建议 AOP 切面。

5.  [**Spring AOP AspectJ `@AfterReturning`示例**](https://howtodoinjava.com/spring/spring-aop/aspectj-after-returning-annotation-example/)

    学习使用`@AfterReturning`注解返回后建议 AOP 切面。

6.  [**Spring AOP AspectJ `@AfterThrowing`示例**](https://howtodoinjava.com/spring/spring-aop/aspectj-afterthrowing-annotation-example)

    学习使用`@AfterThrowing`注解抛出后建议 AOP 切面。

## 7\. 更多 Spring AOP 教程

1.  [**Spring AOP Aspects 排序**](https://howtodoinjava.com/spring/spring-aop/spring-aop-specifying-aspects-ordering/)

    在需要按特定顺序执行的多个切面中，学习对切面执行进行排序。

2.  [**Spring AOP AspectJ 切入点表达式示例**](https://howtodoinjava.com/spring/spring-aop/writing-spring-aop-aspectj-pointcut-expressions-with-examples/)

    学习编写切点表达式以匹配各种连接点。

## 8\. 面试题

[**热门 Spring AOP 面试问题与答案**](https://howtodoinjava.com/spring/spring-aop/top-spring-aop-interview-questions-with-answers/)

Java 面试中一些最常问到的 Spring AOP 面试问题。

## 9\. Spring AOP 资源：

[Spring AOP 文档](https://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.html)

[AspectJ](https://eclipse.org/aspectj/)

学习愉快！