Spring中注释处理的顺序(@Cacheable和@Timed)

我想用@Cacheable以及@Timed(来自千分尺)注释我的方法。 但我希望仅在数据未计时的情况下应用@Timed。 有没有办法做到这一点,将注解以正确的顺序放置就足够了吗?那是哪个顺序?

我的@Timed也在使用TimedAspect,不确定是否相关。

现在我像下面这样:

@Cacheable
@Timed
public String getvalue(long id) {
    ...
}

我找不到@Cacheable的任何文档来讨论这一点。

zj19850618 回答:Spring中注释处理的顺序(@Cacheable和@Timed)

这很棘手,因为您正在处理Spring在您的业务bean周围创建的AOP代理,因此我不确定是否可以依赖注释的顺序。

我认为您有几种选择:

  • 您可能希望将代码重构为具有多种方法,一种方法标记为@Cacheable,另一种方法标记为@Timed。但是,我认为这将对您不起作用,因为您需要多个bean(AOP代理不会拦截同一bean的调用)。因此,您将需要两个Bean,一个充当Facade,另一个充当您要缓存和监视的实际@Timed昂贵调用。
  • 另一种选择可能是同时扩展@Timed@Cacheable并在两个接口中实现Orderable,然后在您的bean中使用它们。我不确定这是否会奏效,因为这取决于如何拾取注释。这句话:Specifying the order of proxy creation in Spring

希望有帮助。

,

我有同样的问题;这是我的代理方法的样子:

  @Cacheable(cacheNames = {"myCache"})
  @Timed("getFoo")
  public MyObject getFoo() {
    ...
  }

我不确定,所以我添加了一些日志消息,发现实际上在调用该方法时,Timed方面只是因为高速缓存未命中而被命中。我不确定这是因为Spring的代理尊重方法中注释的顺序,还是出于其他原因。但是为了安全起见,我提出了自己的建议(因为TimedAspect始终无法为我工作)并实施了org.springframework.core.Ordered

  @Override
  public int getOrder() {
    // Ensures that the @Timed annotation is processed *after* any other proxied annotations on the
    // method (such as @Cacheable),so we only record the method call if it's actually called.
    return Ordered.LOWEST_PRECEDENCE;
  }
本文链接:https://www.f2er.com/3168442.html

大家都在问