2010-09-19 4 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; 
       } 
     } 

И это АОП боб:

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 * *(..))" 

журнал показывает System.out.println класса AfterReturningExample. Что мне не хватает?

+0

Решение найдено! –

ответ

0

Решение найдено! Прежде всего, MyClass не является аспект, поэтому не требуется @Aspect аннотация. Во-вторых, MyClass должен быть реализацией данного интерфейса (указан MyClassInterface), а в тестовом коде лучше использовать MyClassInterface bean = (MyClassInterface) ctx.getBean("testBean1");. Я мог бы использовать прокси класса, а не интерфейс, только если в beans.xml Я добавил <aop:aspectj-autoproxy proxy-target-class="true"/> и CGLIB lib в путь к классам.