AOP是spring框架的第二大核心. AOP:Aspect Oriented Programming(面向切面编程、面向方面编程).面向切面编程就是面向特定方法编程。

概念理解 - 例子

Pasted image 20250629160911

除了传统的计时方法: 这个功能如果通过AOP来实现,我们只需要单独定义下面这一小段代码即可,不需要修改原始的任何业务方法即可记录每一个业务方法的执行耗时。

Pasted image 20250629160955

所以,AOP的优势主要体现在以下四个方面:

AOP基础

入门

Pasted image 20250629161101

  1. 导入依赖:在 pom.xml 文件中导入 AOP 的依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>
  1. 编写AOP程序:针对于特定方法根据业务需要进行编程
@Component//表示交给spring管理
@Aspect //当前类为切面类
@Slf4j
public class RecordTimeAspect {

    @Around("execution(* com.itheima.service.impl.DeptServiceImpl.*(..))")//最终业务层的所有的方法在运行的时候都会执行这段AOP程序,最终统计出所有业务层方法的执行耗时
    public Object recordTime(ProceedingJoinPoint pjp) throws Throwable {
        //记录方法执行开始时间
        long begin = System.currentTimeMillis();

        //执行原始方法
        Object result = pjp.proceed();//原始方法的返回值可能各种各样,所以统一用object接收

        //记录方法执行结束时间
        long end = System.currentTimeMillis();

        //计算方法执行耗时
        log.info("方法执行耗时: {}毫秒",end-begin);//可以使用pjp.getSignature()获取到方法签名,此时就可以知道是哪一个方法运行的耗时
        return result;
    }
}

我们通过AOP入门程序完成了业务方法执行耗时的统计,那其实AOP的功能远不止于此,常见的应用场景如下:

核心概念

连接点:JoinPoint,可以被AOP控制的方法(暗含方法执行时的相关信息)

可以被aop控制的方法

。例如:入门程序当中所有的业务方法都是可以被aop控制的方法.

Pasted image 20250629161652

通知:Advice,指哪些重复的逻辑,也就是共性功能(最终体现为一个方法)

Pasted image 20250629161832

切入点:PointCut,匹配连接点的条件,通知仅会在切入点方法执行时被应用。

切面:Aspect,描述通知与切入点的对应关系(通知+切入点)

当通知和切入点结合在一起,就形成了一个切面。通过切面就能够描述当前aop程序需要针对于哪个原始方法,在什么时候执行什么样的操作。

Pasted image 20250629162059

而切面所在的类,称之为切面类(被@Aspect注解标识的类)。

目标对象:Target,通知所应用的对象

目标对象指的就是通知所应用的对象,我们就称之为目标对象。

Pasted image 20250629162144