Spring的@Cacheable在返回列表的方法上做了什么?

时间:2015-09-17 07:17:49

标签: java spring ehcache

我在网上到处寻找上述问题的简单答案,但却找不到它。我有一个方法:

@Cacheable(cacheNames = "objects")
public List<Object> get() { .. }

我在Spring Framework 4.2.1中使用EhCache 2.10.0,我可以看到此方法的以下输出:

Adding cacheable method 'get' with attribute: [CacheableOperation[public java.util.List com.example.DAO.get()] caches=[objects] | key='' ...

也(在以后的日志记录中)

Computed cache key 'SimpleKey []' for operation ...

在这种情况下@Cacheable注释应该做什么?将每个对象放在由hashCode键入的缓存中(如其他地方暗示的那样)?或者只是将整个列表按原样放入缓存中的某些基于列表的hashCode?

1 个答案:

答案 0 :(得分:8)

Spring Doc提到了这个:

  

由于缓存本质上是键值存储,因此每次调用一个   需要将缓存的方法转换为适合缓存的密钥   访问。开箱即用,缓存抽象使用简单   KeyGenerator基于以下算法:

     
      
  •     

    如果没有给出参数,请返回SimpleKey.EMPTY

      
  •   
  •     

    如果只给出一个参数,则返回该实例

      
  •   
  •     

    如果给出了更多的参数,则返回从所有参数的哈希计算出的密钥。

      
  •   

https://docs.spring.io/spring/docs/5.0.8.RELEASE/spring-framework-reference/integration.html#cache

当您使用@Cacheable(cacheNames = "objects")对其进行注释时,您可以为其指定一个缓存名称,以便识别缓存。由于您的方法没有任何参数,因此对于cacheName作为&#34;对象&#34;,它将已经缓存了返回对象(在这种情况下为List<Object>)。每次调用该方法时,它都会使用cacheName对象检查缓存,并使用键值作为&#39; 0&#39;。如果它已经有一个上次缓存的返回对象,它将返回该对象。

已更新:使用SimpleKey.EMPTY密钥,无法获得Spring 4+的参数