我对使用@Cacheable注释很新。我对我实施它的方式有疑问。
在我的申请表中,我有以下内容......
public class LovCodeDaoImpl extends AbstractDao implements LovDao {
private static final String CODE_LOV_SQL =
" SELECT " +
" code, " +
" code_desc value" +
" FROM repman.code_detail " +
" WHERE code_type=? " +
" ORDER BY code_seq ";
@Cacheable(value = "lovs", key = "#code")
public Map<String, String> getLov(String code) {
Map<String, String> codes =
(Map<String, String>) getJdbcTemplate()
.query(
CODE_LOV_SQL
,new Object[]{code}
,new LovMapExtractor());
return codes;
}
}
这个方法我们用来从db中检索许多不同的值列表。例如,从我的代码中的不同位置,使用AA或BB或CC调用此方法。我想要实现的是将每个不同的地图存储在不同密钥下的缓存中。
所以我的问题是每当我传入一个不同的密钥时,会将Map存储在另一个缓存中吗?或者它每次都会覆盖相同的缓存?如果它不按我的意愿工作,我需要做些什么才能让它以我想要的方式工作。
感谢您的帮助。
答案 0 :(得分:1)
正如官方documentation中所提到的,使用@Cacheable
的方式将导致Spring使用code
作为缓存键。
这意味着当您第一次使用"AA"
调用方法时,Spring将正常执行该方法并将结果映射存储在缓存中的密钥"AA"
下。使用"AA"
进行的后续调用将从缓存中返回结果。
当您使用"BB"
调用该方法时,由于缓存中不存在该键的任何条目,因此Spring将再次执行该方法并将结果存储在密钥"BB"
下的缓存中,而不管在不同密钥下的缓存中已有的内容。
总之,您配置缓存的方式是正确的。 然而,我可以更简化,看起来像
@Cacheable("lovs")
因为Spring会自动使用方法的参数作为缓存的关键