spring @AfterReturning返回值問(wèn)題
spring @AfterReturning返回值
@AfterReturning是用于做aop的,其中返回值的問(wèn)題,坑了我比較久,特地寫出來(lái)。
1. 正確的使用
@AfterReturning(value = "pointCut()", returning = "obj")
public Object doAfterReturning(JoinPoint joinPoint, Object obj) {
// 正常情況下,我們想要修改obj,只需要強(qiáng)轉(zhuǎn)為對(duì)應(yīng)的對(duì)象,再重新設(shè)置值即可,如下
User user = (User)obj;
user.setName("test");
return user;
}2. 錯(cuò)誤的使用
@AfterReturning(value = "pointCut()", returning = "obj")
public Object doAfterReturning(JoinPoint joinPoint, Object obj) {
// 直接修改了obj的引用地址
User user = new User();
obj = user;
return obj;
}區(qū)別就是方式一并沒有更改obj的引用指針地址,返回結(jié)果是更新了name屬性后的用戶
而方式二更改了obj引用指針,返回結(jié)果并不是新new的user對(duì)象,而是入?yún)bj對(duì)象
所以使用時(shí)要注意:
AfterReturning方法雖然能修改返回值,但是局限于相同的對(duì)象地址,即最后返回對(duì)象的引用地址和入?yún)⒌囊玫刂繁仨毾嗤?/p>
所以能修改返回值的也只有引用類型,基本類型是不允許的
@AfterReturning方法執(zhí)行了,但是切入方法沒執(zhí)行
首先,在一個(gè)批量插入的方法定義了切入點(diǎn)
@Pointcut(value = "execution(* com.cases.dao.mapper.duty.DutyTableDao.insertBatch(..))")
public void pointcut() {
log.info("DutyDeleteInterceptor:pointcut");
}@AfterReturning方法可以正常進(jìn)入,但是批量插入insertBatch方法卻沒有執(zhí)行。
原因就在@Around注解方法
這是原來(lái)的代碼
@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();
}調(diào)試,成功。
小知識(shí):
joinPoint.proceed() 的返回值是Object類型,Object result = joinPoint.proceed();
其實(shí)這句代碼的意思就是正常去執(zhí)行我們的業(yè)務(wù),返回值result,在錯(cuò)誤代碼中,返回值寫成了void,所以正常業(yè)務(wù)拿不到返回值了
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
一文搞懂MyBatis多數(shù)據(jù)源Starter實(shí)現(xiàn)
本文將實(shí)現(xiàn)一個(gè)MyBatis的Springboot的Starter包,引用這個(gè)Starter包后,僅需要提供少量配置信息,就能夠完成MyBatis多數(shù)據(jù)源的初始化和使用,需要的小伙伴可以參考一下2023-04-04
java中l(wèi)ist使用時(shí)需避免的場(chǎng)景總結(jié)
眾所周知,Java為開發(fā)者提供了多種集合類的實(shí)現(xiàn),其中幾乎所有業(yè)務(wù)代碼都需要用到List,但List的錯(cuò)誤使用也會(huì)導(dǎo)致諸多問(wèn)題,所以本文我們就來(lái)看一看幾個(gè)錯(cuò)誤使用List的場(chǎng)景吧2023-10-10
Java中控制多線程順序執(zhí)行的六種實(shí)現(xiàn)方案
在多線程編程中,線程的執(zhí)行順序本質(zhì)上是不確定的,由操作系統(tǒng)調(diào)度器決定,但在某些業(yè)務(wù)場(chǎng)景中,我們需要確保線程按照特定順序執(zhí)行,所以本文介紹了Java中控制多線程順序執(zhí)行的六種實(shí)現(xiàn)方案,需要的朋友可以參考下2025-09-09
MongoDB中ObjectId的誤區(qū)及引起的一系列問(wèn)題
這篇文章主要介紹了MongoDB中ObjectId的誤區(qū)及引起的一系列問(wèn)題,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-12-12
@Transaction,@Async在同一個(gè)類中注解失效的原因分析及解決
這篇文章主要介紹了@Transaction,@Async在同一個(gè)類中注解失效的原因分析及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12

