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;
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
@Cacheable注解是Spring框架用于缓存方法返回结果的注解。当一个方法被@Cacheable注解标记后,Spring会检查缓存是否存在该方法的返回值,如果存在,则直接从缓存获取结果并返回;如果不存在,则执行方法体,并将返回值存入缓存使用@Cacheable注解需要注意以下几点: 1. 在需要缓存结果的方法上使用@Cacheable注解。 2. 可以指定缓存的名称,通过value属性来指定,如:@Cacheable(value="myCache")。 3. 可以指定缓存的Key,通过key属性来指定,如:@Cacheable(key="#param")。其#param表示方法的参数值,还可以使用SpEL表达式来动态构建key。 4. 默认情况下,缓存的Key是由方法的所有参数组成的,如果不希望使用所有参数构建Key,可以使用condition属性来限制条件,如:@Cacheable(condition="#param.length() < 10")。这里的condition表示只有当参数长度小于10时才进行缓存。 5. 可以指定缓存的过期时间,通过设置expire属性来指定,如:@Cacheable(expire=3600)。单位为秒,默认为-1,表示永不过期。 示例代码: ```java @Service public class UserService { @Cacheable(value = "users", key = "#id") public User getUserById(String id) { // 从数据库获取用户信息 // ... return user; } } ``` 上述示例,getUserById方法会根据id参数从缓存获取User对象,如果缓存不存在,则执行方法体并将返回值存入缓存。 需要注意的是,@Cacheable注解只能用于Spring容器管理的Bean,即被@Service、@Component等注解标记的类的方法才能被缓存。另外,为了使@Cacheable注解生效,需要在Spring配置文件配置缓存管理器(如使用Ehcache、Redis等)。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值