【发布时间】:2012-02-03 09:32:24
【问题描述】:
我是第一次开始使用 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 启用了 Spring aspect 工具,现在我通过该方法收到以下编译器警告:
"描述资源路径位置类型 datasync.aop.aspects.SyncLoggingAspect 中定义的建议尚未应用 [Xlint:adviceDidNotMatch] SyncLoggingAspect.java /DataSync/src/main/datasync/aop/aspects"
【问题讨论】:
-
与语法无关,你使用 Spring AOP 代理吗?如果是这种情况,我猜您将 GmailContactPoller 创建为 Spring bean,而不是使用
new。您是否从同一个对象调用doPoll?在这种情况下,Spring 代理不起作用,因为您调用的是this.doPoll而不是proxifiedInstance.doPoll -
我的 GmailContactPoller 是作为 spring bean 创建的。从这个 bean 的外部调用一个公共方法,该方法又调用它自己的抽象方法 doPoll() (doPoll 实际上是受保护的,但在这个例子中我将它保留为公共的,所以工作和不工作表达式之间的区别是一个词) .所以你是正确的,它遵循路径 proxy.this.method1 > call > this.doPoll。我不知道这是行为,因为我认为方面 J 通过操纵字节码或在编译时编织以不同的方式工作?还是 spring AOP 在它的实现中是独立的?
-
进一步摆弄你是对的,有没有办法解决这个问题?
标签: spring aop spring-aop