2010-09-19 89 views
0

我只是用AspectJ(1.6)和Spring(2.5)一起玩,但它似乎沒有以正確的方式工作。 設置我「的beans.xml」使用:Spring AOP錯過了什麼

<aop:aspectj-autoproxy/> 
<bean id="testBean1" class="apackage.MyClass"> 
<bean id="aopBean1" class="apackage.AfterReturningExample"/> 

與設置正確的命名空間和其他一些豆類,沒有意義。 我使用一個簡單的豆,以測試建議:

package apackage; 

     @Aspect 
     public class MyClass { 

      public MyClass() 
      { 

      } 
       public Boolean testAspectJ() 
       { 
         System.out.println("returning from MyClass.testAspectJ()"); 
         return false; 
       } 
     } 

而這正是AOP豆:

package apackage;  
@Aspect 
    public class AfterReturningExample { 
     public AfterReturningExample(){} 
     @AfterReturning("execution(* apackage.MyClass.*(..))") 
     public void test() throws Exception{ 

      System.err.println("\n\n#### After Returning MyClass.testAspectJ()\n\n"); 
     } 
    } 

最後這是測試代碼(主法):

ApplicationContext ctx = new ClassPathXmlApplicationContext("apackage/beans.xml"); 
MyClass bean = (MyClass) ctx.getBean("testBean1"); 
bean.testAspectJ(); 

輸出僅打印:

returning from MyClass.testAspectJ() 

奇怪的是,如果我使用的切入點:

"execution(public * *(..))" 

的日誌顯示AfterReturningExample類的System.out.println。 我錯過了什麼?

+0

找到解決方案! – 2010-09-19 22:54:40

回答

0

找到解決方案! 首先,MyClass不是一個方面,所以不需要@Aspect註釋。 第二件事,MyClass必須是一個給定接口的實現(稱爲MyClassInterface),並且在測試代碼中,我最好使用MyClassInterface bean = (MyClassInterface) ctx.getBean("testBean1");。 只有在beans.xml我已將<aop:aspectj-autoproxy proxy-target-class="true"/>和CGLIB庫添加到類路徑中時,我纔可以使用類代理而不是接口。