我第一次开始使用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“
答案 0 :(得分:5)
Spring AOP Proxies和aspectJ主要有一些区别:
您可以查看sections 8.4 & 8.5 of Spring's Documentation以获取更多信息。
目前您有两种解决方案:
答案 1 :(得分:2)
尝试:
@Before("execution(public * *.doPoll(..))")
public void anyPublic() {
System.out.println("HIT POINTCUT");
}