aspectj和带有aspectj autoproxy的spring

aspectj和带有aspectj autoproxy的spring,spring,aspectj,Spring,Aspectj,我已经使用@Aspect注释声明了我的方面,但是建议似乎没有得到应用。这个方面在我所拥有的其他几个项目中都可以使用,关键的区别似乎是其他项目完全是使用注释连接的,而这个特定的项目是xml连接的。惟一连接注释的bean是方面。所以我想知道spring在使用aspectj autoproxy时对aspectj的支持是否对在xml中定义bean的顺序敏感 例如,AOP切入点是否会考虑在xml中aspectj autoproxy之后声明的bean 编辑: 我移动了 也就是说,除了handleReques

我已经使用@Aspect注释声明了我的方面,但是建议似乎没有得到应用。这个方面在我所拥有的其他几个项目中都可以使用,关键的区别似乎是其他项目完全是使用注释连接的,而这个特定的项目是xml连接的。惟一连接注释的bean是方面。所以我想知道spring在使用aspectj autoproxy时对aspectj的支持是否对在xml中定义bean的顺序敏感

例如,AOP切入点是否会考虑在xml中aspectj autoproxy之后声明的bean

编辑:

我移动了

也就是说,除了handleRequest(),我不能将建议应用于任何方法

编辑3:


我最近的一次尝试是重写handleRequest()并在那里应用我的注释。假设spring代理我的控制器时,它将看到注释并应用建议,因为它是通过公共的外部调用方法调用的。这仍然不起作用。

我看到您直接从同一类中的另一个方法调用方法
handleX
。这与注释无关,因为处理AOP注释的工作是由包装类并公开相同接口的JDK代理完成的


您可以通过使用CGLIB而不是JDK代理来解决这个问题,但根据我的经验,最可靠的解决方案就是不依赖任何AOP注释来实现内部调用的方法。

请发布一些代码;e、 g.定义方面、建议和切入点的appcontext.@abalogh:我有一种感觉,如果我简化代码,它就会工作。当aspectj/spring不能按预期工作时,调试它的最佳方法是什么?是的,我现在明白了。但是我也不能调用spring的handle()方法,因为它是受保护的,而且这只是一个内部方法(!)。这不是spring“外部”调用的方法。但我想要实现的是拦截并应用所有控制器子集的环绕建议。如果不使用@Controller/@RequestMethod,我真的不知道该怎么做。建议?我认为这是正确的答案,但有两个问题。首先,我必须重写公共方法handleRequest并将注释放在那里。第二个aspectj autoproxy只需要在实例化所有bean之后进行。说实话,我没有使用aspectj autoproxy。我主要使用其他AOP集成(@Transactional,一些Spring安全性的东西,等等)。我的一位同事发现了一个问题,即使用@RequestMapping的控制器方法似乎不尊重Spring安全注释。我不知道这是否有关系。
@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(...);
    }
}
<context:component-scan base-package="package.of.some.aspect" />
<aop:aspectj-autoproxy />

<!-- the rest of the beans below -->
<bean id="someController" class="..." />