【发布时间】:2011-06-17 19:03:42
【问题描述】:
我已经使用@Aspect 注释声明了我的切面,但建议似乎没有得到应用。该方面适用于我拥有的其他一些项目,主要区别似乎是其他项目完全使用注释连接,并且这个特定项目是 xml 连接的。唯一连接注释的 bean 是 Aspect。所以我想知道spring的aspectj支持是否在使用aspectj-autoproxy时对在xml中定义bean的顺序很敏感。
例如,xml中aspectj-autoproxy之后声明的bean是否会被考虑用于AOP切入点?
编辑:
我移动了<aop:aspectj-autoproxy />,直到创建了所有 bean 之后仍然没有运气。
基本上我的代码包括:
@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。这就是这次不同的地方。
编辑2: 另一个区别是其他项目使用@Controller 和@RequestMethod。在这种情况下,我使用的是 AbstractCommmandController 的派生类。我想知道这是否适用: http://forum.springsource.org/archive/index.php/t-46637.html
也就是说,除了 handleRequest(),我不能对任何方法应用建议。
EDIT3:
我最近的尝试是覆盖 handleRequest() 并在那里应用我的注释。假设当 spring 代理我的控制器时,它会看到注释并应用建议,因为它是通过公共的、外部调用的方法调用的。这仍然不起作用。
【问题讨论】:
-
请贴一些代码;例如定义方面、建议和切入点的应用上下文。
-
@abalogh:我有一种感觉,如果我简化代码,它将起作用。当这些东西不能按预期工作时,调试 aspectj/spring 的最佳方法是什么?