springboot aop切到service層,不生效問題
springboot aop切到service層,不生效
發(fā)現(xiàn)一個問題
使用aop切到service層方法上,idea會有切成功的標(biāo)志,編譯也不報錯,但就是不生效。
研究了下發(fā)現(xiàn),是因為我切的方法被同一個service中的其他方法調(diào)用,這樣的話就不生效了,原因是切面只能對被spring代理的對象起作用,自己調(diào)用不行,解決方法是切到spring代理的方法上,這只是切點不生效的一種情況,給到大家參考。
AOP文件:
//注釋掉的是原來不生效的方式 //@AfterReturning("execution( * cn.qdcares.fodmonitor.web.api.fodmonitor.fodtask.service.impl.FodTaskServiceImpl.radarSubmitFodTask(..))") @AfterReturning("execution( * cn.qdcares.fodmonitor.web.api.fodmonitor.fodtask.service.impl.FodTaskServiceImpl.refreshRadarFodTask(..))") public void createFodAfterReturning(JoinPoint joinPoint){
service文件二者關(guān)系:
//切到這里生效 @Override public int refreshRadarFodTask(RadarFod radarFod) { //判斷數(shù)據(jù)庫中是否存在數(shù)據(jù) //從而進(jìn)行新增或更新操作 Optional<FodTask> optional = fodTaskRepository.findByFodId(radarFod.getId()); if (optional.isPresent()){ updateFodTaskByFodId(radarFod); return 1; } radarSubmitFodTask(radarFod); return 1; } //切到這里不生效 @Override public int radarSubmitFodTask(RadarFod radarFod) { return 1; }
spring中aop無法攔截service層內(nèi)部方法調(diào)用
問題描述
在service類中有個a方法調(diào)用內(nèi)部b方法時,無法攔截到b方法。
示例:
例如如下示例代碼,當(dāng)訪問controller的hello方法時,無法攔截service層testA方法中調(diào)用到的內(nèi)部testB方法。
package com.example.test.controller; import com.example.test.service.Service; ================================================controller層======== @RestController public class TestController{ @Autowired Service service; @RequestMapping("") public void hello(String name) { service.testA(name); } } ================================================Service層======== package com.example.test.service; public class Service{ public void testA(String name); } ================================================Service實現(xiàn)類======== package com.example.test.service.impl; public class ServiceImpl impl Service{ @Override @Transactional public void testA(String name) { testB(name); } public void testB(String name){ } } ==========================ASPECT============= @Component @Aspect @Order(1) public class ServiceAspect { @Before("execution(* com.example.test..*.testA(..))") public void approve(JoinPoint joinPoint) { Object[] args = joinPoint.getArgs(); } }
解決方法
1.修改Service層的testA方法:
package com.example.test.service.impl; public class ServiceImpl impl Service{ @Override @Transactional public void testA(String name) { ServiceImpl service = AopContext.currentProxy() != null ? (ServiceImpl)AopContext.currentProxy() : this; service.testB(name); } public void testB(String name){ System.out.println(name); } }
2.在springboot啟動類上開啟aop代理
@EnableAspectJAutoProxy(exposeProxy = true)
3.重新啟動后,aop就能攔截到testB方法。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
springmvc+mybatis 做分頁sql 語句實例代碼
本文通過一段實例代碼給大家介紹了springmvc+mybatis 做分頁sql 語句的方法,代碼簡單易懂,非常不錯,具有參考借鑒價值,需要的朋友參考下吧2017-07-07springboot項目關(guān)閉swagger如何防止漏洞掃描
這篇文章主要介紹了springboot項目關(guān)閉swagger如何防止漏洞掃描,本文通過示例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-05-05Java并發(fā)編程創(chuàng)建并運行線程的方法對比
這篇文章主要為大家詳細(xì)介紹了Java并發(fā)編程創(chuàng)建并運行線程的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-03-03SpringBoot實現(xiàn)HTTP調(diào)用的七種方式總結(jié)
小編在工作中,遇到一些需要調(diào)用三方接口的任務(wù),就需要用到 HTTP 調(diào)用工具,這里,我總結(jié)了一下 實現(xiàn) HTTP 調(diào)用的方式,共有 7 種(后續(xù)會繼續(xù)新增),需要的朋友可以參考下2023-09-09SpringBoot整合ShardingSphere的示例代碼
本文主要介紹了SpringBoot整合ShardingSphere的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09java中的過濾器 Filter應(yīng)用小結(jié)
文章主要介紹了Java Web中的過濾器(Filter)的基本概念、生命周期、配置和應(yīng)用,過濾器可以攔截請求和響應(yīng),用于執(zhí)行一些預(yù)處理或后處理操作,如設(shè)置編碼、校驗用戶身份等,感興趣的朋友一起看看吧2025-03-03SpringBoot中OKHttp和壓縮文件的使用實戰(zhàn)教程
本文介紹了如何在SpringBoot中使用OKHttp發(fā)起請求和處理壓縮文件,包括文件的存儲配置、實體類、配置類和初始化類的設(shè)置,以及如何通過主程序和測試類進(jìn)行實際操作,最后提供了必要的依賴添加方法,以確保功能的實現(xiàn)2024-10-10