我在网上到处寻找上述问题的简单答案,但却找不到它。我有一个方法:
@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? p>
答案 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+的参数