我已经使用@Aspect注释声明了我的方面,但建议似乎没有得到应用。该方面适用于我所拥有的其他一些项目,关键区别似乎是其他项目使用注释完全连线,这个特定的项目是xml有线。连接注释的唯一bean是Aspect。所以我想知道spring的aspectj支持,当使用aspectj-autoproxy时,对于在xml中定义bean的顺序很敏感。
例如,将xml中的aspectj-autoproxy之后声明的bean考虑用于AOP切入点吗?
编辑:
我移动<aop:aspectj-autoproxy />
直到所有豆子都被创建后仍然没有运气。
基本上我的代码包括:
@Component
@Aspect
public class SomeAspect {
@Pointcut("@annotation(MyAnnotation)")
public void isX() {}
@After("isX()")
public void XX() {
System.out.println("Called aspect");
}
}
我的控制器有类似的东西:
public class XController extends AbstractCommandController {
@MyAnnotation
public void handleX(...) {
// do stuff
}
@Override
protected void handle(...) {
return handleX(...);
}
}
然后spring xml是:
<context:component-scan base-package="package.of.some.aspect" />
<aop:aspectj-autoproxy />
<!-- the rest of the beans below -->
<bean id="someController" class="..." />
我之前的项目通过组件扫描捕获并加载了所有bean。这次是不同的。
EDIT2: 另一个区别是其他项目正在使用@Controller和@RequestMethod。在这种情况下,我正在使用AbstractCommmandController的派生类。我想知道这是否适用: http://forum.springsource.org/archive/index.php/t-46637.html
即我不能将建议应用于除handleRequest()之外的任何方法。
EDIT3:
我最近的尝试是覆盖handleRequest()并在那里应用我的注释。假设当spring代理我的控制器时,它会看到注释并应用建议,因为它通过公共外部调用方法调用。这仍然不起作用。
答案 0 :(得分:3)
我看到你直接从同一个类中的另一个方法调用方法handleX
。这不会考虑注释,因为处理AOP注释的工作是由包装类并暴露相同接口的JDK代理完成的。
您可以通过使用CGLIB而不是JDK代理来解决这个问题,但根据我的经验,最可靠的解决方案是不依赖于内部调用的方法的任何AOP注释。