当前位置:首页 > 科技  > 软件

严重!Spring AOP Bug导致切面重复执行

来源: 责编: 时间:2024-06-11 17:52:52 17观看
导读环境:Spring6.1.71. 问题复现为了提高代码的复用性和维护性,我们设计了一个通用的抽象的切面父类。这个父类封装了通用的切面逻辑,如日志记录、性能监控、异常处理等。通过继承这个抽象父类,具体的业务切面可以轻松地扩展

环境:Spring6.1.7SXI28资讯网——每日最新资讯28at.com

1. 问题复现

为了提高代码的复用性和维护性,我们设计了一个通用的抽象的切面父类。这个父类封装了通用的切面逻辑,如日志记录、性能监控、异常处理等。通过继承这个抽象父类,具体的业务切面可以轻松地扩展或定制这些通用功能,而无需从零开始编写切面逻辑。如下示例:SXI28资讯网——每日最新资讯28at.com

public abstract class CommonAspect {  @Pointcut("execution(public * com.pack..*.*(..))")  private void commonPointcut() {}  @Before("bean(*Service)")  protected void beforeLog(JoinPoint jp) {    System.out.println("通用日志记录...") ;  }  @Around("@annotation(monitor)")  protected Object monitorRun(ProceedingJoinPoint pjp, Monitor monitor) throws Throwable {    Object ret = null ;    // TODO    ret = pjp.proceed() ;    // TODO    return ret ;  }  // other}

具体切面子类

@Component@Aspectpublic class LogAspect extends CommonAspect {  @Override  public void beforeLog(JoinPoint jp) {    System.out.println("重写日志记录功能") ;  }}

当项目运行时出现诡异的问题,既然打印了2次日志信息。SXI28资讯网——每日最新资讯28at.com

// 测试代码AnnotationConfigApplicationContext context = ... ;PersonService ps = context.getBean(PersonService.class) ;ps.queryById(1L) ;

执行结果

重写日志记录功能重写日志记录功能查询Person对象

虽然执行了我们重写的方法,但是日志确输出了2遍。SXI28资讯网——每日最新资讯28at.com

通过debug分析

容器在启动初始化解析@Aspect切面时,在获取切面类中的所有方法时,会得到两个方法(父类及子类重写的)SXI28资讯网——每日最新资讯28at.com

图片图片SXI28资讯网——每日最新资讯28at.com

在这里的getAdvisorMethods方法返回了3个方法,其中2个是父类中的一个是子类重写的方法SXI28资讯网——每日最新资讯28at.com

图片图片SXI28资讯网——每日最新资讯28at.com

那么接下来根据这2个方法就会生成对应的Advisor对象。SXI28资讯网——每日最新资讯28at.com

图片图片SXI28资讯网——每日最新资讯28at.com

这也就是为什么重复的原因了。Spring并没有判断我当前的这个通知是否是重写父类的方法。SXI28资讯网——每日最新资讯28at.com

注:在Spring中@Aspect定义的切面最终都会转换为Advisor对象,当代理类在执行时会遍历所有符合添加的Advisor然后从中取出对应的Advice(MethodInterceptor)对象。SXI28资讯网——每日最新资讯28at.com

既然知道了问题出现的原因,接下来就进行解决该问题。SXI28资讯网——每日最新资讯28at.com

2. 解决问题

2.1 解决办法1

我们可以在子类重写的方法上再加上通知类型,将切入点设置的不匹配任何方法即可SXI28资讯网——每日最新资讯28at.com

@Before("execution(public * xxxooo())")@Overridepublic void beforeLog(JoinPoint jp) {  System.out.println("重写日志记录功能") ;}

在这里重写的方法上,将切入点重新写,该切入点不会匹配任何的方法,这样修改以后再次执行SXI28资讯网——每日最新资讯28at.com

重写日志记录功能查询Person对象

正常执行,没有重复输出日志。SXI28资讯网——每日最新资讯28at.com

2.2 解决办法2

该方法需要将Spring版本升级到6.1.8,在该版本中解决了该问题。来看看在该版本中是如何解决的。SXI28资讯网——每日最新资讯28at.com

6.1.8版本

核心方法还是在上面debug是看到的getAdvisors方法中SXI28资讯网——每日最新资讯28at.com

public class ReflectiveAspectJAdvisorFactory {  public List<Advisor> getAdvisors(...) {    List<Advisor> advisors = new ArrayList<>();    for (Method method : getAdvisorMethods(aspectClass)) {      // 在这里加入了判断(当前方法是否与当前切面中的方法相同)      // 当遍历到这里的Method是父类中的方法时,这里的getMostSpecificMethod      // 方法就会判断根据方法的名称再从当前切面类中获取方法(那当然就不同了)      if (method.equals(ClassUtils.getMostSpecificMethod(method, aspectClass))) {        Advisor advisor = getAdvisor(method, lazySingletonAspectInstanceFactory, 0, aspectName);        if (advisor != null) {          advisors.add(advisor);        }      }    }  }}

图片图片SXI28资讯网——每日最新资讯28at.com

在6.1.8版本中通过这种方式就排除了父类的方法。SXI28资讯网——每日最新资讯28at.com

其它版本

图片图片SXI28资讯网——每日最新资讯28at.com

低于6.1.8版本,都没有相应的判断。SXI28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-93092-0.html严重!Spring AOP Bug导致切面重复执行

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: PHP 服务实现性能剖析、跟踪和可观察性14444444444444】=102102102102102102102102102102102102102102102102实践

下一篇: 多线程编程在 C# 中的基础概念与实现

标签:
  • 热门焦点
  • 2023 年的 Node.js 生态系统

    2023 年的 Node.js 生态系统

    随着技术的不断演进和创新,Node.js 在 2023 年达到了一个新的高度。Node.js 拥有一个庞大的生态系统,可以帮助开发人员更快地实现复杂的应用。本文就来看看 Node.js 最新的生
  • CSS单标签实现转转logo

    CSS单标签实现转转logo

    转转品牌升级后更新了全新的Logo,今天我们用纯CSS来实现转转的新Logo,为了有一定的挑战性,这里我们只使用一个标签实现,将最大化的使用CSS能力完成Logo的绘制与动画效果。新logo
  • 如何正确使用:Has和:Nth-Last-Child

    如何正确使用:Has和:Nth-Last-Child

    我们可以用CSS检查,以了解一组元素的数量是否小于或等于一个数字。例如,一个拥有三个或更多子项的grid。你可能会想,为什么需要这样做呢?在某些情况下,一个组件或一个布局可能会
  • 一条抖音4亿人围观 ! 这家MCN比无忧传媒还野

    一条抖音4亿人围观 ! 这家MCN比无忧传媒还野

    作者:Hiu 来源:互联网品牌官01 擦边少女空降热搜,幕后推手曝光被网友誉为&ldquo;纯欲天花板&rdquo;的女网红井川里予,近期因为一组哥特风照片登上热搜,引发了一场互联网世界关于
  • 华为HarmonyOS 4升级计划公布:首批34款机型今日开启公测

    华为HarmonyOS 4升级计划公布:首批34款机型今日开启公测

    8月4日消息,今天下午华为正式发布了HarmonyOS 4系统,在更流畅的前提下,还带来了不少新功能,UI设计也有变化,会让手机焕然一新。华为宣布,首批机型将会在
  • 苹果、三星、惠普等暂停向印度出口笔记本和平板电脑

    苹果、三星、惠普等暂停向印度出口笔记本和平板电脑

    集微网消息,据彭博社报道,在8月3日印度突然禁止在没有许可证的情况下向印度进口电脑/平板及显示器等产品后,苹果、三星电子和惠普等大公司暂停向印度
  • OPPO K11样张首曝:千元机影像“卷”得真不错!

    OPPO K11样张首曝:千元机影像“卷”得真不错!

    一直以来,OPPO K系列机型都保持着较为均衡的产品体验,历来都是2K价位的明星机型,去年推出的OPPO K10和OPPO K10 Pro两款机型凭借各自的出色配置,堪称有
  • 苹果140W USB-C充电器:采用氮化镓技术

    苹果140W USB-C充电器:采用氮化镓技术

    据10 月 30 日 9to5 Mac 消息报道,当苹果推出新的 MacBook Pro 2021 时,该公司还推出了新的 140W USB-C 充电器,附赠在 MacBook Pro 16 英寸机型的盒子里,也支
  • 世界人工智能大会国际日开幕式活动在世博展览馆开启

    世界人工智能大会国际日开幕式活动在世博展览馆开启

    30日上午,世界人工智能大会国际日开幕式活动在世博展览馆开启,聚集国际城市代表、重量级院士专家、国际创新企业代表,共同打造人工智能交流平台。上海市副市
Top