Spring @Cacheable在春季无法与自定义键一起正常使用

时间:2019-09-11 15:32:09

标签: java spring-boot caching ehcache spring-cache

对于不同的cachedData值,它每次都会从参数中的cachedData提取响应日期,而据我了解,对于特定的propertyId,如果已经调用了某些cachedData参数,则不应再次获取,而应从缓存。

MyMethod

@Cacheable(value = "responseCached", key="#propertyId", condition = "#result != null")
public Date fetchCachedData(String propertyId, Map<String, Date> cachedData) {
    return cachedData.get(propertyId);
}

ehCacheConfig

@EnableCaching
@Configuration
public class EhCacheConfig {

    @Bean
    public EhCacheManagerFactoryBean ehCacheManagerFactory(){
        EhCacheManagerFactoryBean ehCacheBean = new EhCacheManagerFactoryBean();
        ehCacheBean.setConfigLocation(new ClassPathResource("ehcache.xml"));
        ehCacheBean.setShared(true);
        return ehCacheBean;
    }

    @Bean
    public CacheManager cacheManager() {
        SimpleCacheManager cacheManager = new SimpleCacheManager();
        List<Cache> caches = new ArrayList<Cache>();
        caches.add(new ConcurrentMapCache("responseCached"));
        cacheManager.setCaches(caches);
        return cacheManager;
    }
}

1 个答案:

答案 0 :(得分:1)

我认为您对一般概念有误解。如果用@Cacheable注释一个方法,则在数据已经在缓存中的情况下,避免执行该方法。在您的示例中,缓存是ConcurrentMapCache而不是cachedData。简单的例子是:

@Cacheable(value = "responseCached", key="#propertyId")
public Date fetchData(String propertyId) {
    // computing or I/O intensive code to produce result here
    Date d = ...
    return d;
}

对于唯一的propertyId,方法fetchData仅执行一次。您可以省略键定义,因为它是唯一的参数。

方法名称fetchCachedData的注释:Spring缓存抽象的思想是,方法的用户(理想情况下)不需要知道是否缓存了某些内容。最好以业务领域中的某种名称来命名您的方法,例如fetchOfferDate