簡體   English   中英

Spring AspectJ樣式AOP

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM