gpt4 book ai didi

Spring AOP : Annotation on any method called x not working

转载 作者:IT老高 更新时间:2023-10-28 13:50:22 24 4
gpt4 key购买 nike

我是第一次开始使用 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)方法,但是当调用这样的方法时,什么都不会发生:

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 的父类(super class)方法在称为 Poller 的抽象类中是抽象的。没有接口(interface)会不会出问题?

编辑:我刚刚注意到我的 IDE 启用了 spring aspect 工具,现在我通过该方法收到以下编译器警告:

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

最佳答案

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

  • Spring AOP 仅适用于公共(public)方法。
  • Spring AOP 不适用于自调用。

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

目前你有两种解决方案:

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

关于 Spring AOP : Annotation on any method called x not working,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9126433/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com