【问题标题】:Spring AOP: Annotation on any method called x not workingSpring AOP:对任何名为 x 的方法的注释不起作用
【发布时间】: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


【解决方案1】:

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

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

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

目前你有两种解决方案:

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

【讨论】:

    【解决方案2】:

    试试:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多