一次springboot aop 不生效的奇葩分析之旅

【特殊情况】SpringBoot的@Aspect注解不起作用的问题 关于SpringBoot踩的坑。 阅读详情

 一天不码点代码,心里就难受,度娘一波,copy了如下一段简单的aop代码,run起来,惊讶了,竟然没有生效。

package com.foo.bar.aspect;

import cn.hutool.json.JSONUtil;
import java.util.Map;
import java.util.Objects;
import javax.servlet.http.HttpServletRequest;
import javax.validation.constraints.NotNull;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

/**
 * controller aop log
 * @author foobar
 */
@Aspect
@Component
@Order(Ordered.LOWEST_PRECEDENCE - 2)
@Slf4j
public class LogAspect {

  private static final String START_TIME = "request-start";

  /**
   * 切面
   */
  @Pointcut(value = "execution(public * com.foo.bar.controller.*.*(..))")
  public void log() {

  }

  /**
   * 前置操作
   *
   * @param point 切入点
   */
  @Before("log()")
  public void beforeLog(@NotNull JoinPoint point) {
    ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
    HttpServletRequest request = Objects.requireNonNull(attributes).getRequest();
    Map<String, String[]> parameterMap = request.getParameterMap();
    log.info("【请求 URL】:{},【请求 IP】:{},【请求参数】:{}", request.getRequestURL(), request.getRemoteAddr(), JSONUtil.toJsonStr(parameterMap));
    Long start = System.currentTimeMillis();
    request.setAttribute(START_TIME, start);
  }

  /**
   * 环绕操作
   *
   * @param point 切入点
   * @return 原方法返回值
   * @throws Throwable 异常信息
   */
  @Around("log()")
  public Object aroundLog(@NotNull ProceedingJoinPoint point) throws Throwable {
    Object result = point.proceed();
    log.info("【返回值】:{}", JSONUtil.toJsonStr(result));
    return result;
  }

  /**
   * 后置操作
   */
  @AfterReturning("log()")
  public void afterReturning() {
    ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
    HttpServletRequest request = Objects.requireNonNull(attributes).getRequest();

    Long start = (Long) request.getAttribute(START_TIME);
    Long end = System.currentTimeMillis();
    log.info("【请求耗时】:{}毫秒", end - start);
  }
}

心里慌的一批,难道是时代变化太快,版本更新太多,这么经典的一段aop代码怎能不生效呢,于是度娘 “springboot aop 不生效”。

开始一一尝试:

1.检查依赖包,这个一般不需要主动引入,比如这里spring-boot-starter-web就包含了aop的依赖

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
      <exclusions>
        <exclusion>
          <artifactId>spring-boot-starter-tomcat</artifactId>
          <groupId>org.springframework.boot</groupId>
        </exclusion>
      </exclusions>
    </dependency>
    <dependency>

2.检查有没有引入aspectjrt与aspectjweaver

没有引入aspectjweaver的话,

    <!-- 切面 start -->
    <!-- 可不引入,已被aspectjweaver包含 -->
<!--    <dependency>-->
<!--      <groupId>org.aspectj</groupId>-->
<!--      <artifactId>aspectjrt</artifactId>-->
<!--      <version>1.9.6</version>-->
<!--    </dependency>-->
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjweaver</artifactId>
      <version>1.9.6</version>
    </dependency>
    <!-- 切面 end -->
可不引入aspectjrt,aspectjweaver已包含aspectjrt,如下图 

3.检查切面类上注解

注解齐全时:

对比下代理对象与非代理对象

缺少注解@Component时:

4.检查调用切面方法时,是否使用了代理类

比如是否采用了错误的this调用,我这里不存在这个

本着求实创新的精神主旨,咱也断点看一波

不要问我为什么能精确debug这行,想知道自己去看源码

比如看看这个 [强烈推荐]SpringMVC源码分析

5.检查切面表达式是否书写正确

  /**
   * 切面
   */
  @Pointcut(value = "execution(public * com.foo.bar.controller.*.*(..))")
  public void log() {

  }

随便找了一篇pointcut的表达式教学

spring aop中pointcut表达式完整版

6.最后的解决方案

奇葩原因还可能是这个

看到这里还没有解决问题的,我大概知道为啥了,可能是你手贱进行了红色字体不可思议的操作,可能只有上帝知道你为啥要这样做。

 在创建AOP类时选择了Aspect类型,创建后又觉得不妥又把这个文件改为Class类型,最后死活怎么跑Aop就是不生效。

这时你可能需要看下下面这张神奇的图

解决办法

重新创建一个Java Class类型的文件,把原来AOP的代码拷过去就可以了。

idea中Aspect是啥

这个问题很重要吗,我觉一点也不重要,网上都是使用class做aop,使用idea中Aspect做aop的应该是稀缺物种,至少我还没有建构,不过作为求实创新一代的传承人,我还是去度娘找了找,有兴趣的可以看看这个。

 

AspectJ——简介以及在IntelliJ IDEA下的配置

SpringBoot 3.4.x升级踩坑全记录:从JDK17到中间件集成实战 在Java服务升级到SpringBoot 3.4.x的过程中,开发者往往面临从JDK 17基线、Jakarta命名空间迁移到依赖冲突等一系列挑战。理解自动装配原理是排查问题的关键——新版已从spring.factories全面转向AutoConfiguration.imports,配合条件注解实现按需加载。同时,事务失效与循环依赖等经典问题在新版本中表现得更为隐蔽,尤其在多数据源场景下需显式指定事务管理器。结合MyBatis、Redis等中间件集成,以及Docker多阶段构建的实战,可以帮助团队平稳完成版本 阅读详情

相关推荐

基于超图SuperMap iObjects JAVA的SpringBoot工程搭建与整合(三)—— SuperMap iObjects JAVA如何与Spring的IOC结合

使用Spring框架整合其他任何第三方工具,最优雅的方式就是将实例化工作交给Spring完成

Young-weiai 973

Springboot aop不起作用的问题

最近在研究Springboot切面编程,碰到一个莫名其妙的问题,aop怎么都不起作用。自定义的注解使用到了aop,却是有效的。 网上查找了几个小时, 各种方式都试了(使用的是InteliJ IDEA编辑器)。 首先确认了pom.xml文件里是载入了aop的 其次,确认了切面类是没有问题的, package com.jeealfa.aspect; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.*; i

fafa211的专栏 8708

springboot-公共模块自定义注解,在其他微服务无法生效问题

下面这样写也没有问题:@ComponentScans({@ComponentScan("com.nanjing.common")})因为@SpringBootApplication中已经包含@ComponentScan注解 默认扫描当前包下面的文件。解决办法:在启动类加上公共模块的包路径@ComponentScan("com.nanjing")这里之所以说你这注解是多余的是因为你这个扫描包的路径和默认路径是相同的。

兴趣是最好的老师 1699

调用内部方法,SpringBoot AOP注解失效问题排查与解决

调用内部方法,SpringBoot AOP注解失效问题排查与解决

园区阿祖的博客 4625

解决springboot的aop切面不起作用问题(失效的排查)

主要介绍了解决springboot的aop切面不起作用问题(失效的排查),具有很好的参考价值,希望对大家有所帮助。 一起跟随小编过来看看吧

解决Linux下Questasim中代码字体非常小

Questasim的source窗口里代码字体非常小 你是不是也遇到这样的问题,在使用Vmware时,Questasim的代码字体非常小,小到完全看不见,连断点都没办法标记。 下面我给出我摸索好久的解决办法,分享给大家。 1.首先,版本是Questasim 10.7c,在Vmware16中打开,情况如下: 不多逼逼,直接上图开搞: 给textFontV2设置值:monospace 12 normal roman 这里一定要注意啦,点完apply之后,不要点ok,直接关闭窗口。 ...

SummerXRT的博客 7810

互联网大厂Java面试实录:谢飞机的奇葩答题之旅

ReentrantLock 啊,嗯……额,面向对象嘛,无非就是封装、继承、多态。封装就是把东西装起来,继承嘛就是儿子继承老子的东西,多态就是……HashMap 哦,底层不就是数组和链表嘛,后来听说又加了红黑树?MyBatis,就是个 ORM 框架嘛,帮我们写 SQL 的。核心线程数、最大线程数、存活时间,还有队列……啊,不对,是快一点。好了,今天的面试就到这里吧,我们回去后会对你的表现进行评估,请回去等通知。什么自动配置,我记不清了……Spring 啊,听说过,核心功能就是 IOC 和 AOP,对吧?

m0_62762293的博客 204

TeXstudio完整安装配置教程(2025最新版)

至此,你已经完成了TeXstudio的完整安装和配置!现在你可以:✅ 使用TeXstudio编写LaTeX文档✅ 正确编译中英文混排的文档✅ 掌握基本的编辑和配置技巧LaTeX的学习曲线较陡,但一旦掌握,你会发现它在学术写作中的强大之处。建议从简单的文档开始练习,逐步掌握更高级的功能。祝你LaTeX写作顺利!如果有任何问题,欢迎在评论区留言交流。关键词:TeXstudio安装、LaTeX环境配置、中文LaTeX、TeX Live、学术论文写作更新日期:2025年10月。

weixin_51241407的博客 4495

面试大厂:谢飞机的奇葩面试之旅

好的,今天的面试到此结束,你的表现很有趣。回去等通知吧!

weixin_49732297的博客 290

ADG同步性能优化:如何正确配置standby redolog避免WAIT_FOR_LOG状态

本文深入剖析了Oracle ADG(Active Data Guard)同步中常见的WAIT_FOR_LOG状态,指出其根源在于Standby Redo Log(SRL)配置不当。文章提供了从诊断到优化的完整实践指南,重点阐述了SRL大小匹配、组数充足等黄金配置法则,帮助架构师从根本上避免同步延迟,实现稳定高效的实时数据同步。

weixin_29200485的博客 333

SECS/GEM EAP 设备自动化功能原理和设计方案

半导体SECS GEMEAP实现了对生产线上机台的实时监控,是工厂自动化不可缺少的控制系统。EAP系统与FAB中的机台紧密相关,系统的设计与开发必须与生产线的机台实际生产流程相一致,才能达到控制机台生产的目的。 EAP SECS/GEM是MES与设备的桥梁,EAP通过SECS国际标准协议与机台进行数据传输。SECS是半导体设备(半导体行业称设备为机台)必须遵循的一种国际通信协议。EAP就是通过SECS与设备通信、传输数据、发送指令控制设备按照预先定义........

semisecs 17万+

SpringBoot结合Aop+Redis防止接口重复提交

为什么要防止接口重复提交? 对于有些敏感操作接口,比如新增数据接口、付款接口,要是用户操作不当多次点击提交按钮,这些接口就会被多次请求,最后可能导致系统异常。 前端可以如何控制? 前端可以通过js进行控制,当用户点击提交按钮, 1.按钮设置多少秒内不可点击状态 2.按钮点击后弹出loading提示框,避免再次点击,直到接口请求返回后 3.按钮点击后跳转到新的页面 但是,请记住,永远不要相信用户的行为,因为你不知道用户会做哪些奇葩的操作,所以,最重要的还是要在后端处理。 使用aop+redis进行拦截处

xsxy0506的博客 752

matsim教程及其案例

MATSim 是一个强大的交通仿真工具,适合研究交通政策、出行行为优化和城市规划。建议从官方示例入手,逐步尝试修改参数和扩展功能。遇到问题时,优先查阅官方文档和社区讨论。(Multi-Agent Transport Simulation Toolkit)的教程和案例资源整理,涵盖基础入门、核心概念、实际应用案例及学习路径。MATSim 是一个开源的、基于多智能体的交通仿真框架,用于模拟城市交通系统中的出行行为、交通流量和交通政策影响。

weixin_70682362的博客 1093

记一次SpringBoot 开发中所遇到的坑和解决方法

记一次SpringBoot 开发中所遇到的坑和解决方法 mybatis返回Integer为0,自动转型出现空指针异常 当我们使用Integer去接受数据库中表的数据,如果返回的数据中为0,那么Integer便为null,这时候将Interger自动转型为int,则会出现空指针异常 这个时候,我们可以在Service层对Integer的数据进行判断,如果为空,就把它赋值为...

weixin_30894389的博客 1261

CST新手必看:共面波导色散曲线绘制全流程(附参数设置避坑指南)

本文详细介绍了CST Microwave Studio中绘制共面波导色散曲线的全流程操作,特别针对新手常见的边界条件设置错误、参数扫描失效等问题提供解决方案。通过模型建立、边界条件设置、本征模求解器配置等步骤,帮助工程师快速掌握CPW色散特性分析方法,并附有参数设置避坑指南,提升高频电路设计效率。

tomato的博客 986

Android实现自动输入文本效果 (附完整源码)

Android实现自动输入文本效果 (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 414

SpringBoot教程(二十五) | SpringBoot集成AOP实现事务管理

SpringBoot集成AOP实现事务管理

qq_20236937的博客 639

别再只会复制Haar级联代码了!OpenCV人脸检测全方案深度解析,从原理到工业级落地

通用预训练模型在你的业务场景效果不好时,用自己的业务数据集训练专属的级联器,是提升精度的终极方案,OpenCV自带和工具,支持自定义Haar/LBP级联器训练。场景首选方案次选方案新手入门学习Haar级联分类器LBP级联分类器嵌入式轻量固定场景LBP级联分类器YuNet轻量版工业级落地项目(99%场景)DNN+YuNetMTCNN多人脸+小目标复杂场景DNN+YuNet自定义微调模型同时做人脸+其他目标检测。

2601_94871597的博客 379

图文详解 Spring AOP,看完必懂!

往期热门文章:1、面试官:内存耗尽后Redis会发生什么 ? 2、监控告警满飞天,运维在家睡到自然醒... 3、@Bean与@Component 同时作用同一个类,会怎么样? 4、闲鱼面试...

Java之间 176

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

springboot调用php,SpringBoot开启异步调用方法

异步调用无需等待,方法相当于子线程,后台执行,主线程执行完成,子线程开始执行。SpringBoot 开启异步执行仅需两步:方法上加 @Async@Override@Async@Transactional(rollbackFor = Exception.class)public Integer init(DatePojo datePojo){//xxxxxxxxxxx 业务略 xxxxxxxlog....

weixin_35767900的博客 508

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

SpringBoot开启异步调用方法

异步调用无需等待,方法相当于子线程,后台执行,主线程执行完成,子线程开始执行。 SpringBoot 开启异步执行仅需两步: 方法上加 @Async @Override @Async @Transactional(rollbackFor = Exception.class) public Integer init(DatePojo datePojo){ ...

. 976

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

记录一个奇葩问题:idea中 springboot项目 run方式启动20秒, debug方式却无法启动,一直打印日志

idea中 springboot项目 run方式启动20秒, debug方式却无法启动,一直打印日志,仿佛进入了死循环,这是为甚 1111 2019-07-10 10:39:15.095 DEBUG 25700 --- [ main] o.s.aop.framework.CglibAopProxy : Method is declared...

hlz5857475的博客 1763

互联网大厂Java面试实录:谢飞机的奇葩答题秀

面试的问题循序渐进,涵盖Java核心、并发、框架、分布式、消息中间件、运维等技术点。文末答案帮助小白系统学习相关知识。

slyanaldt的博客 356

SpringBoot+Mybatis实现简单的多数据源动态切换(两种方式含项目Gitee代码地址)

SpringBoot+Mybatis实现简单的多数据源动态切换(两种方式含项目Gitee代码地址)

落日的博客 1114

互联网大厂Java求职面试指南:程序员谢飞机的奇葩面试经历

在某个阳光明媚的下午,谢飞机,一个自称“技术大神”的程序员,走进了某互联网大厂的面试房间,迎接他的是一位面色严肃的面试官。

one_cai_bird的博客 467
上一篇: Spring Boot升级后之文件上传坑
下一篇: SpringBoot log4j2日志追踪
路飞说AI
博客等级 码龄10年 214粉丝 24原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值