spring @AfterReturning返回值问题

 更新时间:2024年05月10日 10:21:25   作者:巴中第一皇子  
这篇文章主要介绍了spring @AfterReturning返回值问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

spring @AfterReturning返回值

@AfterReturning是用于做aop的,其中返回值的问题,坑了我比较久,特地写出来。

1. 正确的使用

@AfterReturning(value = "pointCut()", returning = "obj")
public Object doAfterReturning(JoinPoint joinPoint, Object obj) {
    // 正常情况下,我们想要修改obj,只需要强转为对应的对象,再重新设置值即可,如下
    User user = (User)obj;
    user.setName("test");
    return user;
}

2. 错误的使用

@AfterReturning(value = "pointCut()", returning = "obj")
public Object doAfterReturning(JoinPoint joinPoint, Object obj) {
    // 直接修改了obj的引用地址
    User user = new User();
    obj = user;
    return obj;
}

区别就是方式一并没有更改obj的引用指针地址,返回结果是更新了name属性后的用户

而方式二更改了obj引用指针,返回结果并不是新new的user对象,而是入参obj对象

所以使用时要注意:

AfterReturning方法虽然能修改返回值,但是局限于相同的对象地址,即最后返回对象的引用地址和入参的引用地址必须相同。

所以能修改返回值的也只有引用类型,基本类型是不允许的

@AfterReturning方法执行了,但是切入方法没执行

首先,在一个批量插入的方法定义了切入点

    @Pointcut(value = "execution(* com.cases.dao.mapper.duty.DutyTableDao.insertBatch(..))")
    public void pointcut() {
        log.info("DutyDeleteInterceptor:pointcut");
    }

@AfterReturning方法可以正常进入,但是批量插入insertBatch方法却没有执行。

原因就在@Around注解方法

这是原来的代码

@Around(value = "pointcut()")
public void methodAround(ProceedingJoinPoint joinPoint) throws Throwable {
    log.info("DutyDeleteInterceptor:methodAround");
}

修改后的代码

    @Around(value = "pointcut()")
    public Object methodAround(ProceedingJoinPoint joinPoint) throws Throwable {
        log.info("DutyDeleteInterceptor:methodAround");
        return joinPoint.proceed();
    }

调试,成功。

小知识:

 joinPoint.proceed() 的返回值是Object类型,Object result = joinPoint.proceed();

其实这句代码的意思就是正常去执行我们的业务,返回值result,在错误代码中,返回值写成了void,所以正常业务拿不到返回值了

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 一文搞懂MyBatis多数据源Starter实现

    一文搞懂MyBatis多数据源Starter实现

    本文将实现一个MyBatis的Springboot的Starter包,引用这个Starter包后,仅需要提供少量配置信息,就能够完成MyBatis多数据源的初始化和使用,需要的小伙伴可以参考一下
    2023-04-04
  • Java运算符从见过到掌握下

    Java运算符从见过到掌握下

    计算机的最基本用途之一就是执行数学运算,作为一门计算机语言,Java也提供了一套丰富的运算符来操纵变量,本篇对大家的学习或工作具有一定的价值,紧接上篇,需要的朋友可以参考下
    2021-09-09
  • Java的CollectionUtils工具类详解

    Java的CollectionUtils工具类详解

    这篇文章主要介绍了Java的CollectionUtils工具类详解,CollectionUtils工具类是在apache下的,而不是springframework下的,个人觉得在真实项目中CollectionUtils,可以使你的代码更加简洁和安全,需要的朋友可以参考下
    2023-05-05
  • java中list使用时需避免的场景总结

    java中list使用时需避免的场景总结

    众所周知,Java为开发者提供了多种集合类的实现,其中几乎所有业务代码都需要用到List,但List的错误使用也会导致诸多问题,所以本文我们就来看一看几个错误使用List的场景吧
    2023-10-10
  • Java中控制多线程顺序执行的六种实现方案

    Java中控制多线程顺序执行的六种实现方案

    在多线程编程中,线程的执行顺序本质上是不确定的,由操作系统调度器决定,但在某些业务场景中,我们需要确保线程按照特定顺序执行,所以本文介绍了Java中控制多线程顺序执行的六种实现方案,需要的朋友可以参考下
    2025-09-09
  • Java throw和throws使用区别分析

    Java throw和throws使用区别分析

    这篇文章主要介绍了Java throw和throws使用区别分析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • MongoDB中ObjectId的误区及引起的一系列问题

    MongoDB中ObjectId的误区及引起的一系列问题

    这篇文章主要介绍了MongoDB中ObjectId的误区及引起的一系列问题,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-12-12
  • Java实现单词倒序输出

    Java实现单词倒序输出

    这篇文章主要介绍了Java实现单词倒序输出,帮助大家更好的理解和学习Java,感兴趣的朋友可以了解下
    2020-08-08
  • Java agent的入门与demo演示详解

    Java agent的入门与demo演示详解

    Java Agent 是 Java 1.5 版本之后引⼊的特性,其主要作⽤是在class被加载之前对其拦截,这篇文章主要介绍了agent的简单使用,需要的可以参考下
    2023-05-05
  • @Transaction,@Async在同一个类中注解失效的原因分析及解决

    @Transaction,@Async在同一个类中注解失效的原因分析及解决

    这篇文章主要介绍了@Transaction,@Async在同一个类中注解失效的原因分析及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12

最新评论