[英]Spring AspectJ Style AOP
我有一個使用Spring的Java應用,
@Aspect
public class MyAspect
{
@Pointcut("execution (* com.mycompany.MyClass.*(..))")
public void doStuff() {}
@Around("doStuff()")
public Object aroundDoStuff(ProceedingJoinPoint pjp) throws Throwable
{
System.out.println("before doStuff);
try
{
return pjp.proceed();
}
finally
{
System.out.println("after doStuff");
}
}
}
然后我的春豆文件
<aop:aspectj-autoproxy proxy-target-class="true" />
<bean id="MyAspect"
class="com.mycompany.MyAspect" />
現在,我希望MyClass中的所有方法都可以通過上面的切入點進行匹配,但是事實並非如此(只有其中一種方法似乎已應用了建議)。 我不確定這是否與我正在代理一個類有關,但是有人在這里看到我做錯了嗎?
編輯 :從執行這樣的主類調用代碼:
ApplicationContext cxt; // lookup the cxt
MyClass mc = (MyClass) cxt.getBean("MyClassBean");
mc.doSomething(); // I expect the advice to be applied here.
謝謝,傑夫
原來問題是因為我代理的是類而不是接口。 我需要更改切入點以匹配實現該接口的所有類,然后使用target
切入點過濾到MyClass。
編輯:添加詳細信息...
如果MyClass擴展AbstractMyClass並實現MyInterface,則我希望建議MyInterface中的所有方法,但事實並非如此。 我錯誤地將切入點聲明為:
@Pointcut(execution(* com.mycompany.MyClass.methodInAbstract()))
更改為
@Pointcut(execution(* com.mycompany.MyInterface.methodInAbstract()) && target(com.mycompany.MyClass))
運作良好。
您的CLASSPATH中可能沒有cglib,這是因為當您指定proxy-target-class = true時,將創建一個基於CGLIB的代理,而不是基於默認的Java動態代理的代理。 您可以在路徑中使用CGLIB還是通過刪除proxy-target-class屬性來進行嘗試(假設您的bean確實具有動態代理正常工作所需的接口)。
編輯1:我嘗試了您的示例,並將其放在github上的此位置mvn test -Dtest=TestSpringAOP
://github.com/bijukunjummen/mvc-samples.git,您可以使用mvn test -Dtest=TestSpringAOP
,它似乎運行良好。 您能否檢查一下該測試,看看它與您的案例有何不同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.