spring @Cacheable澄清实施时需要

时间:2014-05-19 03:44:41

标签: spring spring-mvc caching

我对使用@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存储在另一个缓存中吗?或者它每次都会覆盖相同的缓存?如果它不按我的意愿工作,我需要做些什么才能让它以我想要的方式工作。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

正如官方documentation中所提到的,使用@Cacheable的方式将导致Spring使用code作为缓存键。

这意味着当您第一次使用"AA"调用方法时,Spring将正常执行该方法并将结果映射存储在缓存中的密钥"AA"下。使用"AA"进行的后续调用将从缓存中返回结果。

当您使用"BB"调用该方法时,由于缓存中不存在该键的任何条目,因此Spring将再次执行该方法并将结果存储在密钥"BB"下的缓存中,而不管在不同密钥下的缓存中已有的内容。

总之,您配置缓存的方式是正确的。 然而,我可以更简化,看起来像

@Cacheable("lovs")

因为Spring会自动使用方法的参数作为缓存的关键