Java 默认的缓存密钥是什么?

Java 默认的缓存密钥是什么?,java,spring,caching,ehcache,spring-cache,Java,Spring,Caching,Ehcache,Spring Cache,我们在生产中使用以下代码已有相当一段时间了: @Override @Transactional(readOnly = true) @Cacheable("WIDGET_SERVICE_CACHE") public List<WidgetTO> findAllWidgets() { return ...; } @Override @Cacheable("WIDGET_SERVICE_CACHE") @Transactional(readOnly = true) public

我们在生产中使用以下代码已有相当一段时间了:

@Override
@Transactional(readOnly = true)
@Cacheable("WIDGET_SERVICE_CACHE")
public List<WidgetTO> findAllWidgets() {
    return ...;
}

@Override
@Cacheable("WIDGET_SERVICE_CACHE")
@Transactional(readOnly = true)
public List<WidgetHostTO> findAllWidgetHosts() {
    return ...;
}
@覆盖
@事务(只读=真)
@可缓存(“小部件\服务\缓存”)
公共列表findAllWidgets(){
返回。。。;
}
@凌驾
@可缓存(“小部件\服务\缓存”)
@事务(只读=真)
公共列表findAllWidgetHosts(){
返回。。。;
}
正如您所看到的,这两个不同的零参数方法使用相同的缓存。现在,在阅读了一些文档之后,在将元素放入缓存时,似乎没有考虑方法的名称

我们现在不清楚的是,尽管根据文件,它不应该起作用,但它确实起作用了。似乎只有参数用于缓存的键。
如果这是真的,还需要考虑哪些因素。如果没有,它怎么会对我们有用,noet会抛出(类cast)异常?

您使用的是哪个版本的Spring?版本4.0.0中的DefaultKeyGenerator和SimpleKeyGenerator都会导致冲突,因为它们会返回默认值,因为注释的方法没有参数。Spring 4.0.3-事实上,根据文档,应该存在冲突,因为这两种方法的键都是空的。因此我的问题是,为什么不呢?您不会直接拥有ClassCastException,只有在从
列表中提取元素时才会拥有ClassCastException。你到底是如何断言它工作的?我们不断地调用这些方法(并提取元素),为了确保我们已经在debug中运行,在上面的方法之一中设置一个断点,并确认它只在第一次调用时被访问,然后再也不会被访问(但从缓存中获取)。然后下一步,要弄清楚这一点,实际上是查看执行caching-KeyGenerator及其用户的代码内部。我同意这是令人费解的。