我想用@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;
}