首页 文章

aspectj和spring with aspectj-autoproxy

提问于
浏览
6

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

例如,将xml中的aspectj-autoproxy之后声明的bean考虑用于AOP切入点吗?

编辑:

我移动了 <aop:aspectj-autoproxy /> 直到所有 beans 子都被创建后仍然没有运气 .

基本上我的代码包括:

@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 . 在这种情况下,我想知道这是否适用:http://forum.springsource.org/archive/index.php/t-46637.html

即我不能向除handleRequest()之外的任何方法应用建议 .

EDIT3:

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

1 回答

  • 3

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

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

相关问题