spring @AfterReturning返回值問題
spring @AfterReturning返回值
@AfterReturning是用于做aop的,其中返回值的問題,坑了我比較久,特地寫出來。
1. 正確的使用
@AfterReturning(value = "pointCut()", returning = "obj") public Object doAfterReturning(JoinPoint joinPoint, Object obj) { // 正常情況下,我們想要修改obj,只需要強(qiáng)轉(zhuǎn)為對應(yīng)的對象,再重新設(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對象,而是入?yún)bj對象
所以使用時(shí)要注意:
AfterReturning方法雖然能修改返回值,但是局限于相同的對象地址,即最后返回對象的引用地址和入?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注解方法
這是原來的代碼
@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)試,成功。
小知識:
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)文章
解決mybatisPlus 中的field-strategy配置失效問題
這篇文章主要介紹了解決mybatisPlus 中的field-strategy配置失效問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02基于jenkins實(shí)現(xiàn)發(fā)布node.js項(xiàng)目
這篇文章主要介紹了基于jenkins實(shí)現(xiàn)發(fā)布node.js項(xiàng)目,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07SWT(JFace) Menu、Bar...體驗(yàn)代碼
SWT(JFace)體驗(yàn)之Menu、Bar實(shí)現(xiàn)代碼。2009-06-06SpringBoot不讀取bootstrap.yml/properties文件問題
這篇文章主要介紹了SpringBoot不讀取bootstrap.yml/properties文件問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12基于request.getAttribute與request.getParameter的區(qū)別詳解
本篇文章小編為大家介紹,基于request.getAttribute與request.getParameter的區(qū)別詳解。需要的朋友參考下2013-04-04詳解Java中Array和ArrayList的比較和轉(zhuǎn)換
在 Java 編程中,arrays 和 arraylists 都是基本的數(shù)據(jù)結(jié)構(gòu),用來存放數(shù)據(jù)集合,雖然兩者的用途一樣,但是它們的特點(diǎn)極大地影響應(yīng)用的性能和靈活性,本文探討 arrays 和 arraylists 的重要特性,它們各自的強(qiáng)項(xiàng)和弱點(diǎn),,需要的朋友可以參考下2023-08-08一文吃透消息隊(duì)列RocketMQ實(shí)現(xiàn)消費(fèi)冪等原理
這篇文章主要介紹了消息隊(duì)列RocketMQ實(shí)現(xiàn)消費(fèi)冪等的全面講解,幫助大家吃透RocketMQ消息隊(duì)列消費(fèi)冪等,更好的的應(yīng)用與工作實(shí)踐,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01