關於AOP無法切入同類呼叫方法的問題
最近在開發中遇到一個問題,當在Service中定義了一個方法並且切入之後,從Controller裡面呼叫該方法可以實現切入,但是當在同一個Service中實現另一方法並呼叫改方法時卻無法切入。程式碼類似於:
1、service
package zmx.spring.aop.test2; import org.springframework.aop.framework.AopContext; public class TestService { public void callMethodA(){ System.out.println("Method A is called"); callMethodB(); //----------->AOP不能 //((TestService) AopContext.currentProxy()).callMethodB(); System.out.println("Method A is called over"); } public void callMethodB(){ System.out.println("Method B is called"); } }
2、aspect
package zmx.spring.aop.test2; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.Aspect; @Aspect public class TestAspect { @AfterReturning("execution(* zmx.spring.aop.test2.TestService.callMethodB(..))") public void after() { System.out.println("after call and do something."); } }
3、mainTest
package zmx.spring.aop.test2; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class MainTest { @Test public void testCallMethodA(){ ApplicationContext ctx = new ClassPathXmlApplicationContext("zmx/spring/applicationContext.xml"); TestService testService = ctx.getBean("testService", TestService.class); testService.callMethodA(); } }
4、applicationContext.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
<!-- 開啟支援@AspectJ風格的切面宣告 -->
<aop:aspectj-autoproxy/>
<!--<aop:aspectj-autoproxy proxy-target-class="true" expose-proxy="true" /> -->
<!-- 目標物件 -->
<bean id="testService" class="zmx.spring.aop.test2.TestService" />
<!-- 切面 -->
<bean id="testAspect" class="zmx.spring.aop.test2.TestAspect" />
</beans>
總之這樣的呼叫根本不會進去切面,找了很久資料都不知道怎麼回事,果然我還是太弱了。後來有幸得問高人,指點說Service中如此呼叫並非呼叫的是代理類中的方法,是不會被切進去的。換言之,必須要呼叫代理類才會被切進去。 那麼應該怎麼破呢?既然只有呼叫代理類的方法才能切入,那我們拿到代理類不就好了嘛。嘗試性的在IDE裡面搜Aop相關的類,一眼就看到一個叫AopContext的東西,看來遊戲啊,裡面有一個方法叫做currentProxy(),返回一個Object。怎麼樣都要試一下,果斷的把這個object打印出來。報錯了……
- java.lang.IllegalStateException: Cannot find current proxy: Set 'exposeProxy' property on Advised to 'true' to make it available.
<span style="font-size:12px;">java.lang.IllegalStateException: Cannot find current proxy: Set 'exposeProxy' property on Advised to 'true' to make it available.
</span>
等等,這個錯有點眼熟,之前傻傻找不到問題的時候看過Spring的配置。
[xml] view plaincopyprint?- <aop:aspectj-autoproxyproxy-target-class="true"expose-proxy="true"/>
把expose-proxy設成true,再跑一次,終於沒有報錯了,而且打印出了令人欣喜的結果,currentProxy()的結果就是當前Service的代理類,那麼事情簡單了。修改Service的callMethodA()方法如下:
[java] view plaincopyprint?- ((Service) AopContext.currentProxy()).callMethodB();
<span style="font-size:12px;">((Service) AopContext.currentProxy()).callMethodB();
</span>
成功了,方法成功的切入進去了,等下只要再把獲取代理類的方法獨立處理就好了。
相關推薦
關於AOP無法切入同類呼叫方法的問題
最近在開發中遇到一個問題,當在Service中定義了一個方法並且切入之後,從Controller裡面呼叫該方法可以實現切入,但是當在同一個Service中實現另一方法並呼叫改方法時卻無法切入。程式碼類似於: 1、service package zmx.spring.aop.
spring aop無法攔截類內部的方法呼叫
1.概念 攔截器的實現原理就是動態代理,實現AOP機制。Spring 的代理實現有兩種:一是基於 JDK Dynamic Proxy 技術而實現的;二是基於 CGLIB 技術而實現的。如果目標物件實現了介面,在預設情況下Spring會採用JDK的動態代理實現AOP 2.問題 在類C中,方法A呼叫方法B, B方
相同類中方法間呼叫時日誌Aop失效處理
本篇分享的內容是在相同類中方法間呼叫時Aop失效處理方案,該問題我看有很多文章描述了,不過大多是從事務角度分享的,本篇打算從日誌aop方面分享(當然都是aop,失效和處理方案都是一樣),以下都是基於springboot演示; 快速定義個日誌Appender 快速定義個攔截器和日誌註解(aop) 模擬
zipkin使用hystrix無法串聯起呼叫鏈的解決方法
在使用zipkin的過程,引用hystrix導致呼叫鏈條break,原來hystrix預設容錯方法是執行緒隔離,而在這個過程中使用了執行緒池,而執行緒池中的traceId無法重新生成,導致呼叫鏈斷掉,因此重寫HystrixConcurrencyStrategy 類的wrapCallabl
解決spring aop無法攔截代理內部函式呼叫的問題
code如下: public class ServiceAImpl implements ServiceA{ public void function01(...){ ... this.function02(...)
Spring AOP無法攔截Controller中的方法
想使用AOP Annotation配置Spring MVC的Controller進行攔截, 發現無法攔截Controller的方法, 卻可以攔截Service層的方法. 一開始: Spring的配置檔案applicat
Spring中APO切入同類下的其他方法實現事務控制
最近在開發中遇到一個問題,當在Service中定義了一個方法並且切入之後,從Controller裡面呼叫該方法可以實現切入,但是當在同一個Service中實現另一方法並呼叫改方法時卻無法切入。程式碼類似於: /** * Controller 你懂的 */ pu
AOP代理類中呼叫帶有annotation的私有方法
public class Aservice { private void methodA() { methodB(); } @annotation private void methodB(){
spring aop 無法在內部巢狀的方法上生效
1,問題 例子: public void method1(){ ......... method2(); ........... } public void method2(){ ............... .......
ubuntu 使用sudo apt-get update 出現 被配置多次導致無法升級錯誤解決方法
code 開發機 goup 使用 lin logs 配置 周末 ubun 這個周六周末在考慮升級自己GPU開發機,在琢磨使用docker來按轉tensorflow環境,在升級軟件的時候爆出了如下錯誤 在 /etc/apt/sources.list.d/sogoupin
win10無法安裝 nodejs 解決方法
命令幫助 無法安裝 解決方法 .cn 控制 命令行 windows命令 安裝 ejs 以管理員身份運行 命令行(控制臺) 打開之後運行安裝命令: msiexec /package | /i node-v6.11.0-x64.msi (使用 /packa
pip install geohash後無法import的解決方法
比賽 package pac 問題 解決方法 數據 install ini rom 最近在參加摩拜杯數據挖掘比賽,賽方給的數據裏地理位置是用geohash表示的,因此需要安裝geohash庫進行解析 pip install geohash可以直接安裝這個庫,可是裝好之後im
IE8升級新版Flash Player ActiveX14導致的discuz圖片附件無法上傳 解決方法
forum rgb 百度快照 orm 顯示 img 全部 百度 文件上傳 之前發的這篇文章被編輯之後丟失了。無奈從百度快照找來又一次公布。不知道csdn抽啥風 架不住sb adobe的頻繁升級提示,手欠升級到了了flash player 14,
RHEL7/CentOS7 NTP開機無法啟動的解決方法
rhel7/centos7 ntp開機無法啟動的解決方法安裝NTP之後,systemctl enable ntpd設置為開機自動啟動,但是重啟之後NTP並沒有啟動,#systemctl status ntpd ● ntpd.service - Network Time Service Loaded: l
Hyper-V 虛擬機無法上網的解決方法
掩碼 默認 spa http 麻煩 route tro adding href Windows 8中內置的Hyper-V管理器可以說給許多人帶來了驚喜!在Hyper-V管理器強大的同時,也同樣面臨著設置中一些不可避免的麻煩。有人說,Hyper-V虛擬機聯網麻煩,其實,只要
安裝 VirtualBox 出現回滾,無法安裝及解決方法
block 回滾 提示安裝 unable tar trac 既然 命令 現象 原文:安裝 VirtualBox 出現回滾,無法安裝及解決方法 緣由:打算安裝 Vagrant,因此打算安裝 VirtualBox。 現象:安裝 VirtualBox,進度快到最後的時候
Linux mint界面過小無法安裝(解決方法)
log 無法顯示 tin splay 安裝 isp 分區 src es2017 安裝Linux mint時,到了分區的時候,有時候會出現界面過小(就是你點擊不到確定鍵): 大家可以看到下面的確定鍵無法顯示,導致無法安裝。網上查了一下都是清一色的下載vwware tool插
升級JDK9後eclipse無法啟動的解決方法
eclipse java1.9更新到Jdk9後,就出現Eclipse找不到jdk裏面類的問題(無法啟動):org.eclipse.e4.core.di.InjectionException: java.lang.NoClassDefFoundError: javax/annotation/PostCons
MIUI谷歌相冊無法備份的解決方法
gpo 選擇 發現 全部 國際 情況 數據 一個 重新 谷歌相冊有無限空間的相容量,也因為谷歌是國際大廠,對數據的安全性比較放心,把照片放在谷歌相冊是一個不二之選。 重新刷完機後,使用GO谷歌安裝器安裝好谷歌框架,再安裝谷歌相冊。安裝完成之後,可能無法備份,顯示“正在更新狀
JavaEE_Spring_Aspect無法切入Controller層
com ets nature tor factor static gets npoi true 切入的類和被切入的類必須是被spring管理的(springIOC),如果是自己new 出來的,切入無效,所以最好把它放在dispatcher-servlet.xml文件中。 /