1.原因:Cacheable默认使用aop代理方式,通过创建内部类形式实现,而同一个类中调用无法通过代理,所以缓存不生效
2.解决方法:在当前类中注入该类的bean对象,通过当前对象的代理对象实现缓存
public class CacheManagerService {
private static Logger logger= LoggerFactory.getLogger(CacheManagerService.class);
@Resource
private CacheManagerMapper cacheManagerMapper;
//注入当前对象的代理对象
@Resource
private CacheManagerService cacheManagerService;
/**
*获取所有枚举表缓存对象
* @return
*/
@Cacheable(cacheNames = "cacheManager",key ="#key.code")
public List<EnumType> getAllEnumTypeList(EnumCacheKey key){
try {
DbRouteSet.setDataSourceKey("1");
List<EnumType> allEnumTypeList = cacheManagerMapper.getAllEnumTypeList();
return allEnumTypeList;
}catch (Exception e){
logger.error("获取所有枚举对象存入cache缓存出现异常",e);
}
return null;
}
/**
*获取枚举对象名称
* @param type 枚举对象类型
* @param value 编号
* @return
*/
public String getEnumTypeName(String type,String value){
try {
//Cacheable默认使用aop代理,所以同一个类中使用cache缓存失效,需要使用当前对象的代理对象访问
List<EnumType> enumTypeList = cacheManagerService.getAllEnumTypeList(EnumCacheKey.PartEnumTypeInfo);
List<EnumType> list = enumTypeList.stream().filter(t -> t.getType().equals(type) && t.getValue().equals(value)).collect(Collectors.toList());
if (list!=null && list.size()>0){
return list.get(0).getName();
}
}catch (Exception e){
logger.error("获取枚举对象名称出现异常,枚举对象类型{},编号{},",type,value,e);
}
return null;
}