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



我想用@Cacheable@Timed(来自千分尺(注释我的方法。但我希望@Timed仅在数据未定时的情况下应用。有没有办法做到这一点,把注释按正确的顺序排列就足够了?应该是哪个顺序?

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

现在我这样做:

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

我找不到任何@Cacheable的文档来讨论这个问题。

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

我认为你有几个选择:

  • 您可能需要重构代码,使其具有多个方法,一个用@Cacheable标记,另一个用@Timed标记。然而,我认为这将不适用于您,因为您需要多个bean(对同一bean的调用不会被AOP代理截获(。因此,您需要两个bean,一个充当facade,另一个执行您想要缓存和监视的实际@Timed昂贵调用
  • 另一种选择可能是扩展@Timed@Cacheable,并在这两个接口中实现Orderable,然后在bean中使用它们。我不完全确定这是否有效,因为这将取决于如何提取注释。大致如下:指定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;
}

相关内容

最新更新