首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【SpringBoot】AOP 概述 && Spring AOP 快速入门

【SpringBoot】AOP 概述 && Spring AOP 快速入门

原创
作者头像
lirendada
发布2026-07-22 09:58:04
发布2026-07-22 09:58:04
1220
举报
文章被收录于专栏:JavaJava

Ⅰ. AOP 概述

什么是AOP?

  • Aspect Oriented Programming(面向切面编程)

什么是面向切面编程呢?

  • 切面就是指某一类特定问题,所以 AOP 也可以理解为面向特定方法编程。

什么是面向特定方法编程呢? 比如上个章节学习的 "登录校验",就是一类特定问题。登录校验拦截器,就是对 "登录校验" 这类问题的统一处理。所以,拦截器也是 AOP 的一种应用。AOP 是一种思想,拦截器是 AOP 思想的一种实现。Spring 框架实现了这种思想,提供了拦截器技术的相关接口。 同样的,统一数据返回格式和统一异常处理,也是 AOP 思想的一种实现。

简单来说:AOP 是一种思想,是对某一类事情的集中处理

而 Spring AOP 是 Spring 框架提供的基于代理的面向切面编程实现,用于在不修改源代码的前提下对程序进行增强。比如说统一管理日志打印、权限控制、事务管理等重复、与业务无关的逻辑。

Ⅱ. Spring AOP 快速入门

需求:统计图书系统各个接口方法的执行时间。

1. 引入依赖

首先在 pom.xml 文件中添加配置:

代码语言:javascript
复制
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

2. 编写 AOP 程序

记录 Controller 中每个方法的执行时间

代码语言:javascript
复制
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

@Slf4j
@Aspect
@Component
public class TimeAspect {
    /**
     * 记录方法耗时
     */
    @Around("execution(* com.example.demo.controller.*.*(..))")
    public Object recordTime(ProceedingJoinPoint pjp) throws Throwable {
        // 记录方法执行开始时间
        long begin = System.currentTimeMillis();
        
        // 执行原始方法
        Object result = pjp.proceed();
        
        // 记录方法执行结束时间
        long end = System.currentTimeMillis();
        
        // 记录方法执行耗时
        log.info(pjp.getSignature() + "执行耗时: {}ms", end - begin);
        return result;
    }
}
  1. @Aspect:标识这是一个切面类
  2. @Around:环绕通知,在目标方法的前后都会被执行,后面的表达式表示对哪些方法进行增强。
  3. ProceedingJoinPoint.proceed():执行原始方法,也就是指定要运行的那些方法

💥注意事项:

  1. 如果没有返回 pjp.proceed() 的结果对象 result,则会导致程序死循环或功能异常
  2. 在使用 @Around 时,必须调用 pjp.proceed() 方法
  3. 这里是为了举例子,通常不能直接拦截所有 controller,否则浏览器访问的时候可能携带了其他访问资源,而后端因为拦截所有资源路径而导致不断重定向尝试,最后缓存炸了。

整个代码划分为三部分:

通过上面的程序,也可以感受到 AOP 面向切面编程的一些优势:

  • 代码无侵入:不修改原始的业务方法,就可以对原始的业务方法进行了功能的增强或者是功能的改变
  • 减少了重复代码
  • 提高开发效率
  • 维护方便

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • Ⅰ. AOP 概述
  • Ⅱ. Spring AOP 快速入门
    • 1. 引入依赖
    • 2. 编写 AOP 程序
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档