Spring AOP:对任何名为x的方法的注释不起作用

时间:2012-02-03 09:32:25

标签: spring aop spring-aop

我第一次开始使用AOP。

我的第一个方面如下:

@Aspect
public class SyncLoggingAspect {
    private final Logger logger = Logger.getLogger(this.getClass());

    @Before("execution(public * *(..))")
    public void anyPublic() {
        System.out.println("HIT POINTCUT");
    }
}

这成功地继续在任何公共方法调用上调用。但是,当我将其更改为:

@Before("execution(public * doPoll(..))")
public void anyPublic() {
    System.out.println("HIT POINTCUT");
}

我希望它可以在任何名为“doPoll”的公共方法上工作,但是当这样的方法被称为没有任何反应时:

public class GmailContactPoller extends ContactPoller<GoogleUser, ContactPusher<GoogleUser>> {
    Logger logger = Logger.getLogger(this.getClass());

    @Override
    public List<? extends ContactPusher<GoogleUser>> doPoll() throws PollException {
           ...
    }
}

EL语法是否缺少某些内容?或者这与继承层次结构有关? doPoll的超类方法在名为Poller的抽象类中是抽象的。没有接口会导致问题吗?

编辑:我刚注意到我的IDE启用了弹簧方面工具,现在我通过该方法发出以下编译器警告:

“描述资源路径位置类型 datasync.aop.aspects.SyncLoggingAspect中定义的建议尚未应用[Xlint:adviceDidNotMatch] SyncLoggingAspect.java / DataSync / src / main / datasync / aop / aspects“

2 个答案:

答案 0 :(得分:5)

Spring AOP Proxies和aspectJ主要有一些区别:

  • Spring AOP仅适用于公共方法。
  • Spring AOP不适用于自我调用。

您可以查看sections 8.4 & 8.5 of Spring's Documentation以获取更多信息。

目前您有两种解决方案:

  1. 重构代码以消除自我调用的需要
  2. 在编译时或加载时使用AspectJ而不是Spring AOP代理。

答案 1 :(得分:2)

尝试:

@Before("execution(public * *.doPoll(..))")
public void anyPublic() {
    System.out.println("HIT POINTCUT");
}