我正在玩Spring(2.5)的AspectJ(1.6),但似乎没有以正确的方式工作。 我使用:
设置我的“beans.xml”<aop:aspectj-autoproxy/>
<bean id="testBean1" class="apackage.MyClass">
<bean id="aopBean1" class="apackage.AfterReturningExample"/>
设置正确的命名空间和其他一些没有重要性的bean。 我使用一个简单的bean来测试建议:
package apackage;
@Aspect
public class MyClass {
public MyClass()
{
}
public Boolean testAspectJ()
{
System.out.println("returning from MyClass.testAspectJ()");
return false;
}
}
这是aop bean:
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 :(得分:0)
找到解决方案!
首先, MyClass 不是Aspect,因此不需要 @Aspect 注释。
第二, MyClass 必须是给定接口的实现(表示 MyClassInterface ),在测试代码中,我最好使用MyClassInterface bean = (MyClassInterface) ctx.getBean("testBean1");
。
我只能在 beans.xml 中添加<aop:aspectj-autoproxy proxy-target-class="true"/>
和类路径中的CGLIB lib时使用类代理而不是接口。