对于不同的cachedData值,它每次都会从参数中的cachedData获取响应日期,而根据我的理解,如果对于特定的propertyId,如果有一些带有某些cachedData参数的调用,它不应该再次获取,而是应该从缓存。
我的方法
@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;
}
}
请您参考如下方法:
我认为您对一般概念有误解。如果您使用 @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
。