Java 什么是春天';当放置在返回列表的方法上时,s@Cacheable做什么?

Java 什么是春天';当放置在返回列表的方法上时,s@Cacheable做什么?,java,spring,ehcache,Java,Spring,Ehcache,我在网上到处寻找上述问题的简单答案,但就是找不到。我有这样一种方法: @Cacheable(cacheNames = "objects") public List<Object> get() { .. } 另外(在以后的日志记录中) 在这种情况下,@Cacheable注释应该做什么?将每个对象放在由hashCode设置关键字的缓存中(如别处所示)?或者只是将整个列表按原样链接到基于列表的哈希代码下的缓存中?Spring文档提到: 由于缓存本质上是键值存储,因此每次调用 需要将缓存的

我在网上到处寻找上述问题的简单答案,但就是找不到。我有这样一种方法:

@Cacheable(cacheNames = "objects")
public List<Object> get() { .. }
另外(在以后的日志记录中)


在这种情况下,@Cacheable注释应该做什么?将每个对象放在由hashCode设置关键字的缓存中(如别处所示)?或者只是将整个列表按原样链接到基于列表的哈希代码下的缓存中?

Spring文档提到:

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

  • 如果未给出任何参数,则返回
    SimpleKey.EMPTY

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

  • 如果给定了多个参数,则返回从所有参数的散列计算出的键

当您使用
@Cacheable(cacheNames=“objects”)
对其进行注释时,您会给它一个缓存名称,它可以根据该名称识别缓存。由于您的方法没有任何参数,因此对于作为“objects”的cacheName,它将已经缓存了返回对象(
List
)。每次调用该方法时,它都会使用cacheName对象和键值“0”检查缓存。如果它已经有上一次缓存的返回对象,它将返回该对象


已更新:使用
SimpleKey.EMPTY
键表示Spring 4+的无参数

,因此它将在第二次调用get()方法时返回整个列表?是的。由于已经有一条执行该方法的记录,因此对象被缓存。请注意,您的方法也必须是公共的才能工作。列表中的单个对象是否可以缓存在单独的键下?方法的“结果”实际上是缓存的。这意味着缓存不是针对对象的,而是针对方法名和它的参数(如java文档所突出显示的),并且方法的结果被缓存在一起。它不关心它是什么类型的对象。它只是缓存结果
Object
Spring4.0+返回SimpleKey.EMPTY,因此是我的应用程序的输出,但无论哪种方式,都非常有用。
Adding cacheable method 'get' with attribute: [CacheableOperation[public java.util.List com.example.DAO.get()] caches=[objects] | key='' ...
Computed cache key 'SimpleKey []' for operation ...