我一直在使用Spring GuavaCacheManager在我的应用程序中进行缓存。
Spring 4.3版,Guava版本20.0
我在spring配置文件中初始化guava缓存构建器并在缓存文件中使用可缓存的注释。
根据Guava CacheBuilder RemovalListener文档,
警告:调用此方法后,请勿继续使用此缓存 建造者参考;而是使用此方法返回的引用。在 运行时,这些指向同一个实例,但只返回 reference具有正确的泛型类型信息,以确保 类型安全。为获得最佳效果,请使用标准方法链接惯用法 在上面的类文档中说明,配置构建器 并在单个语句中构建缓存。没听从这个 通知可能导致缓存抛出ClassCastException 在未来的某个未定义点进行操作。
我在spring配置文件中使用了remove listener返回的引用,但是对于下面的代码,将来某个未定义点的缓存操作是否有可能抛出ClassCastException?
Spring配置文件
@configuration
@EnableCaching
public class SpringConfig {
@Bean
public CacheBuilder<Object, Object> cacheBuilder() {
CacheBuilder<Object, Object> cacheBuilder = CacheBuilder.from("maximumSize=1000,expireAfterAccess=1d").removalListener(addRemovalListener());
return cacheBuilder;
}
@Autowired
private CacheBuilder<Object, Object> cacheBuilder;
@Bean
public CacheManager cacheManager() {
GuavaCacheManager cacheManager = new GuavaCacheManager();
cacheManager.setCacheBuilder(cacheBuilder);
cacheManager.setAllowNullValues(false);
return cacheManager;
}
private RemovalListener<Object, Object> addRemovalListener() {
return new RemovalListener<Object, Object>() {
public void onRemoval(RemovalNotification<Object, Object> removal) {
if(RemovalCause.EXPLICIT != removal.getCause()) {
try {
String key = (String) removal.getKey();
String val = (String) removal.getValue();
......
......
} catch (Exception e) {
logger.error("Cache RemovalListener Exception [{}]", e.getMessage(), e);
}
}
}
};
}
}
Spring缓存文件
@Service
public class SpringCache {
@Autowired
private CacheManager cacheManager;
@Cacheable(cacheManager="cacheManager", key="#p0", cacheNames="cacheKeysMap", sync=true)
public String getKeyFromCache(String key) {
......
......
return value;
}
@CacheEvict(cacheManager="cacheManager", key="#p0", cacheNames="cacheKeysMap")
public void deleteFromCache(String key) {
}
}