说到这里,不得不由衷的佩服spring boot确实不错,以前我还要基于spring cache 把guava cache和redis装进去,现在基于spring boot的 autoconfigure的cache封装,就可以很方便把这些用起来,关于 springboot的cache使用,请参见:http://www.jianshu.com/p/64f684bd0ce9 但麻烦的地方在于,我们的框架+代码自动生成,在整个体系里,默认的实现都在abstract抽象类,那么它只能做一次cacheNames的配置, 如果设置 cacheEvict(allEntries=true),会做全局的失效,而正常是这个模型内的缓存失效,好在 可以自定义 CacheResolver。
不过自定义的CacheResolver,需要注入cacheManager, 而cacheManager不能注入成功, 最终 使用 @Lazy,懒加载,并且 在spring boot应用启动时 将ApplicationContext 设置给ApplicationContextHolder,在 需要的时候获取到cachemanager设置给CacheResolver, 具体代码:
@Component("runtimeImplCacheResolver")
@Lazy
public classRuntimeImplCacheResolverextendsAbstractCacheResolver {
privateApplicationContextctx;
publicRuntimeImplCacheResolver() {
//super.setCacheManager(SpringContextHolder.getApplicationContext().getBean(CacheManager.class));
}
@PostConstruct
public voidinit(){
super.setCacheManager(SpringContextHolder.getApplicationContext().getBean(CacheManager.class));
}
@Override
protectedCollection getCacheNames(CacheOperationInvocationContext context) {
if(context.getOperation().getCacheNames().contains("SECOMMONDYN")){
Set cacheName =newHashSet();
context.getTarget().getClass().toString();
String simpleName = context.getTarget().getClass().getSimpleName();
simpleName = simpleName.substring(0, simpleName.length() -11);
cacheName.add(simpleName);
returncacheName;
}else{
returncontext.getOperation().getCacheNames();
}
}
}
框架调用:
@CacheConfig(cacheNames ="SECOMMONDYN", cacheResolver ="runtimeImplCacheResolver")