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

ben*_*000 13 java spring ehcache

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

@Cacheable(cacheNames = "objects")
public List<Object> get() { .. }
Run Code Online (Sandbox Code Playgroud)

我正在使用带有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='' ...
Run Code Online (Sandbox Code Playgroud)

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

Computed cache key 'SimpleKey []' for operation ...
Run Code Online (Sandbox Code Playgroud)

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

Kar*_*k R 9

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作为"对象",它将已经缓存了返回对象(List<Object>在本例中).每次调用该方法时,它都会使用cacheName对象检查缓存,并将键值设置为"0".如果它已经有一个上次缓存的返回对象,它将返回该对象.

更新:带有SimpleKey.EMPTYSpring 4+没有参数的键

  • 是的,会的。由于已经有执行该方法的记录,因此该对象被缓存。请注意,您的方法也必须公开才能工作。 (2认同)
  • 列表中的单个对象可以缓存在单独的键下吗? (2认同)