对于不同的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
)命名您的方法。