springboot项目同一个类中使用Cacheable不生效

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;
    }
经验分享 程序员 微信小程序 职场和发展