您好,登錄后才能下訂單哦!
這篇文章主要介紹“Spring this調用當前類方法無法攔截的代碼怎么寫”,在日常操作中,相信很多人在Spring this調用當前類方法無法攔截的代碼怎么寫問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Spring this調用當前類方法無法攔截的代碼怎么寫”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
先給出代碼示例
package com.example.demo.service; import org.springframework.stereotype.Service; @Service public class ProxyService { public void testA(){ System.out.println("進入A"); this.testB(); } public void testB() { System.out.println("進入b"); } }
package com.example.demo.annotation; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.springframework.stereotype.Component; @Aspect @Component public class AspectjTest { @Around("execution(* com.example.demo.service.ProxyService.testB())") public void recordProxy(ProceedingJoinPoint joinPoint) throws Throwable { long start = System.currentTimeMillis(); joinPoint.proceed(); long end = System.currentTimeMillis(); System.out.println("花費時間:"+(end-start)); } }
package com.example.demo.api; import com.example.demo.service.ProxyService; import com.example.demo.service.UserService; import org.springframework.aop.framework.AopContext; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PostMapping; @Controller public class ProxyApi { // @Autowired // ProxyService proxyService1; @Autowired private ApplicationContext applicationContext; @PostMapping("/proxy") public String test1() { ProxyService proxyService1 = applicationContext.getBean(ProxyService.class);; proxyService1.testA(); return "string"; } }
運行上面的代碼會發現 配置aop 攔截方法不會被執行
我們通過debug 查看這個proxyService1 和this的區別,看看他們的值是什么
發現不一樣,其實這就是問題的原因。
1、當我們在aop配置攔截的時候會指定類下面的方法路徑,在spring啟動的時候會先去加載這個ProxyService類,生成一個bean,但是因為你用aop配置了,所以需要代理這個ProxyService類,所以最終存在spring容器中的bean對象就是被代理后的bean對象。所以,我們在用容器獲取bean或者用依賴注入獲取bean的地址路徑顯示的是被代理后的bean 。
2、this獲取的當前對象方法的一個引用,所以在調用testB方法的時候用的不是被代理的對象,自熱不會經過aop攔截,原理和我們使用普通動態代理一樣,只能是代理對象才能走自定義的方法。
3、可以通過debug 查看當ProxyService類被代理前和后的zhi值
發現是和之前的debug截圖里面的值相符合的哈。
解決方法,就是在調用testB方法的時候用spring容器里的bean對象
@Service public class ProxyService { @Autowired private ProxyService proxyService; public void testA(){ System.out.println("進入A"); proxyService.testB(); } public void testB() { System.out.println("進入b"); }
或者
@Service public class ProxyService { public void testA(){ System.out.println("進入A"); ProxyService currentProxy = (ProxyService) AopContext.currentProxy(); currentProxy.testB(); } public void testB() { System.out.println("進入b"); } }
最終結果正確
到此,關于“Spring this調用當前類方法無法攔截的代碼怎么寫”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。