📜  Spring AOP教程(1)

📅  最后修改于: 2023-12-03 15:20:12.440000             🧑  作者: Mango

Spring AOP教程

本文将简单介绍 Spring AOP,AOP(面向切面编程)是一种编程范式,用以解决分散在应用程序中的横切关注点(cross-cutting concerns)的问题,比如事务管理、日志记录、安全控制等。

AOP概述

Spring AOP是基于代理的AOP框架,它允许开发人员使用面向切面编程技术将普通Java对象(POJO)转换为可拦截的AOP对象。Spring AOP提供了几个常见的切面(Aspect),如:

  • After Advice:在目标方法执行后执行某些操作;
  • Before Advice:在目标方法执行前执行某些操作;
  • Around Advice:在目标方法执行前和执行后都可以执行一些操作;
  • AfterThrowing Advice:在抛出异常时执行某些操作;
  • AfterReturning Advice:在目标方法执行完毕并返回后执行某些操作。

Spring AOP并不支持所有的Java语言特性(例如反射),但它可以很好地应对大多数AOP需求。

Spring AOP核心概念

Spring AOP中有几个核心概念,重点介绍如下。

Join Point

Join Point是指应用程序中的一个点,如方法执行、异常捕获、字段设置或对象初始化等。Spring AOP只支持方法级别的Join Point,所以还需使用AspectJ或其他框架来支持更丰富的Join Point。

Pointcut

Pointcut是一组Join Point的集合,决定哪些Join Point需要被拦截并添加额外的功能。Spring AOP中支持两种类型的Pointcut:

  • 静态Pointcut:基于方法名、类名、返回类型、参数等静态信息进行匹配;
  • 动态Pointcut:基于程序运行时的动态信息进行匹配。
Advice

Advice是指在切面的某个Join Point执行时,额外添加到该Join Point的代码。Spring AOP支持如下几种Advice:

  • Before Advice
  • After Advice
  • Around Advice
  • AfterThrowing Advice
  • AfterReturning Advice
Aspect

Aspect是指使用Advice拦截Pointcut所定义的Join Point的类,该类通常包含多个Advice。Aspect通过配置文件或注解来定义,Spring会在合适的时候将它们织入到目标对象中。

Spring AOP实战

以下示例展示了如何在Spring AOP中使用AspectJ注解方式的切面定义和配置。

依赖

首先,我们需要添加如下依赖:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.3.5</version>
</dependency>
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.9.6</version>
</dependency>
定义切面

新建一个类,并在类上注解 @Aspect,表示该类是一个Aspect。接着在该类中添加一个方法,并在该方法上注解 @Around("execution(* hello(..))"),表示该方法可以拦截出入参为 hello() 的方法。

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
 
@Aspect
@Component
public class MyAspect {
 
    @Around("execution(* hello(..))")
    public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        System.out.println("Before Hello World!");
        Object result = proceedingJoinPoint.proceed();
        System.out.println("After Hello World!");
        return result;
    }
}
配置切面

在 Spring 配置文件中定义该切面:

<bean id="myAspect" class="com.example.MyAspect" />
 
<aop:config>
    <aop:aspect ref="myAspect">
        <aop:pointcut id="helloMethod"
                      expression="execution(* hello(..))" />
        <aop:around pointcut-ref="helloMethod" method="doAround" />
    </aop:aspect>
</aop:config>

现在,运行应用程序并调用名称为 hello() 的方法,即可看到如下输出:

Before Hello World!
Hello World!
After Hello World!

以上就是 Spring AOP 的基本概念和实战使用方式。希望能够对您学习 AOP 有所帮助。