定义要放在Spring缓存中的值

时间:2016-04-25 15:13:15

标签: java spring spring-cache

使用Spring缓存抽象,我想缓存itemExists方法调用的结果。通过insertItem方法插入项目时,我想将值true放入缓存中。

class MyServiceImpl implements MyService {

   private static final String CACHE_EXISTS_NAME = "existsCache";

   @Override
   @Cacheable(CACHE_EXISTS_NAME)
   public boolean itemExists(Long id) {
       // access the repository the check whether the item exists
   }

   @Override
   @CachePut(cacheNames = CACHE_EXISTS_NAME, key = "#item.id")
   public Item insertItem(Item item) {
       ...
   }

}

我如何实现我的需要?

2 个答案:

答案 0 :(得分:1)

不支持。解决方法可能是定义@Cacheable说你的dao的finder方法,然后从itemExists方法调用它:

在DAO中:

   @Cacheable(CACHE_EXISTS_NAME)
   public Item findById(Long id) {
       //..
   }

在您的服务中:

   @Override
   public boolean itemExists(Long id) {
       if(null == dao.findById(id)) {
           return false;
       } else {
           return true;
       }
   }

请注意,由于方法调用是代理支持的,因此在同一对象(本例中为服务类)中定义和调用finder将导致注释被忽略。

答案 1 :(得分:-1)

我发现你的用例有点令人不安。如果你想查看特定项目是否在缓存中,为什么不问缓存而不是那些错综复杂的间接?您可以注入Cache实例并询问其内容。

我想将您的代码更改为以下代码可能会有效但我真的不建议:

@Override
@CachePut(cacheNames = CACHE_EXISTS_NAME, key = "#item.id")
public boolean insertItem(Item item) {
  ...
  return true;
}