通过接口上的注释使@Cachable条目无效?

时间:2015-01-28 13:32:46

标签: java spring caching

我正在使用spring@Cacheable注释来缓存一些数据库条目。我想定期使完整缓存无效。

因此:将这些注释放在接口方法上是否有效?或者这些注释必须放在类方法上(即使它们有一个空的方法体)?

public interface MyRepository extends CrudRepository<MyEntity, Long> {
    @Override
    @Cacheable("cache")
    Airline findOne(long id);

    @CacheEvict(value = "cache", allEntries = true)
    @Scheduled(cron = "0 0 1 * * *")
    void removeAll();
}

如果我在接口方法上有@Cacheable而服务中有@CacheEvict,则应用程序会成功启动。如果我使用上面的代码,它不起作用。但也许我也做错了什么?

1 个答案:

答案 0 :(得分:13)

它可能会奏效,但我建议将这些注释放在实施上。

这不仅仅是一个理论问题,而是以这种方式思考:接口是一种常见的合同,但缓存是一个实现细节

您的界面可以通过多种方式实现,例如,有一天您可以拥有一个HsqlDBRepository,因为缓存在内存中已经完全没有意义。

从侧面说明,我会仔细考虑为什么你需要逐出所有......根据它发生的频率,它可能会使你的缓存变得无用 - 也就是#&## 39;经常表明设计存在更深层次的问题。 如果你想在一段时间之后逐出实体,可以考虑配置timeToLive / timeToIdle - 大多数缓存后端支持这个很好。