首页 > 其他分享 >Springboot Cache @Cacheable 类内部调用时不生效,解决办法

Springboot Cache @Cacheable 类内部调用时不生效,解决办法

时间:2024-12-25 11:44:08浏览次数:3  
标签:Cacheable Springboot Cache springframework 调用 ------------- org import public

Springboot Cache @Cacheable 类内部调用时不生效,解决办法| Id | Title | DateAdded | SourceUrl | PostType | Body | BlogId | Description | DateUpdated | IsMarkdown | EntryName | CreatedTime | IsActive | AutoDesc | AccessPermission |

| -------------| -------------| -------------| -------------| -------------| -------------| -------------| -------------| -------------| -------------| -------------| -------------| -------------| -------------| -------------|
| 17805125| Springboot Cache @Cacheable 类内部调用时不生效,解决办法| 2023-11-02T12:17:00| | BlogPost|

出现问题的原因:Spring cache的实现原理是基于AOP的动态代理实现的:即都在方法调用前后去获取方法的名称、参数、返回值,然后根据方法名称、参数生成缓存的key(自定义的key例外),进行缓存。this调用不是代理对象的调用, 所以aop失效,注解失效。

解决办法就是,我们获取当前Bean,由它来调用。

SpringContextUtil

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;

/**
不依赖于Autowired而使用java代码快速获取到spring管理的bean
/
@Component
@Lazy(false)
public class SpringContextUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext;
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SpringContextUtil .applicationContext = applicationContext;
}
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
public static Object getBean(String name) {
return getApplicationContext().getBean(name);
}
public static <T> T getBean(Class<T> clazz) {
return getApplicationContext().getBean(clazz);
}
public static <T> T getBean(String name, Class<T> clazz) {
return getApplicationContext().getBean(name, clazz);
}
}

 

Service 调用

package com.mark.pay.service;

import com.mark.pay.bean.User;
import com.mark.pay.common.spring.SpringContextUtil;
import com.mark.pay.dao.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.*;
import org.springframework.stereotype.Service;

@Service
@CacheConfig(cacheNames = "user",cacheManager = "cacheManager")
public class TestService {

@Autowired
UserMapper userMapper;

@Cacheable( key </span>="#id"<span style="color: #000000;">)
</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> User query(Integer id) {
    </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> userMapper.selectByPrimaryKey(id);
}


</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> User testCacheQuery(Integer id){
    TestService service </span>= SpringContextUtil.getBean(TestService.<span style="color: #0000ff;">class</span><span style="color: #000000;">);
    </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> service.query(id);
}

}

 

| 648658| | 2023-11-02T12:17:00| false| | 2023-11-02T12:16:38.94| true| 出现问题的原因:Spring cache的实现原理是基于AOP的动态代理实现的:即都在方法调用前后去获取方法的名称、参数、返回值,然后根据方法名称、参数生成缓存的key(自定义的key例外),进行缓存。this调用不是代理对象的调用, 所以aop失效,注解失效。 解决办法就是,我们获取当前Bean,| Anonymous|

标签:Cacheable,Springboot,Cache,springframework,调用,-------------,org,import,public
From: https://www.cnblogs.com/ralphlauren/p/18621297

相关文章

  • SpringBoot读取
    SpringBoot读取.yml配置文件最常见的两种方式-源码及其在nacos的应用|Id|Title|DateAdded|SourceUrl|PostType|Body|BlogId|Description|DateUpdated|IsMarkdown|EntryName|CreatedTime|IsActive|AutoDesc|AccessPermission||-------------|----......
  • Springboot使用RestTemplate发送Post请求postForEntity (application-json)的坑
    Springboot使用RestTemplate发送Post请求postForEntity(application-json)的坑|Id|Title|DateAdded|SourceUrl|PostType|Body|BlogId|Description|DateUpdated|IsMarkdown|EntryName|CreatedTime|IsActive|AutoDesc|AccessPermission||---------......
  • springboot项目启动成功后执行一段代码的两种方式
    springboot项目启动成功后执行一段代码的两种方式|Id|Title|DateAdded|SourceUrl|PostType|Body|BlogId|Description|DateUpdated|IsMarkdown|EntryName|CreatedTime|IsActive|AutoDesc|AccessPermission||-------------|-------------|-------......
  • SpringCloud与SpringBoot区别
    SpringCloud与SpringBoot区别|Id|Title|DateAdded|SourceUrl|PostType|Body|BlogId|Description|DateUpdated|IsMarkdown|EntryName|CreatedTime|IsActive|AutoDesc|AccessPermission||-------------|-------------|-------------|----------......
  • springboot2
    springboot2.4以后的配置|Id|Title|DateAdded|SourceUrl|PostType|Body|BlogId|Description|DateUpdated|IsMarkdown|EntryName|CreatedTime|IsActive|AutoDesc|AccessPermission||-------------|-------------|-------------|-------------|......
  • springboot高校勤工俭学平台-计算机设计毕业源码66824
    摘 要本研究基于SpringBoot企业框架,设计并实现了一款高校勤工俭学平台,包括首页、通知公告、新闻通知和岗位信息等功能模块。该平台旨在为高校学生提供便捷的勤工俭学信息发布与查询服务,促进校园内部劳动力资源的充分利用和高效管理。在研究背景中,探讨了高校勤工俭学项目的......
  • springboot中华传统服饰文化传播系统-计算机设计毕业源码61792
          中华传统服饰文化传播系统摘要传统服饰作为中华文化的重要组成部分,承载着丰富的历史文化内涵。传播系统的建立和发展对于传统服饰文化的传承至关重要,可以通过各种渠道将中华传统服饰文化推广至世界各地。SPringboot作为一种优秀的Java开发框架,具有快速开发、简......
  • springboot高校食堂自助预约点餐系统-计算机设计毕业源码93989
    目 录1绪论1.1研究背景与意义1.2国内外研究现状1.3论文结构与章节安排2 系统分析2.1可行性分析2.1.1技术可行性分析2.1.2 经济可行性分析2.1.3法律可行性分析2.2系统功能分析2.2.1功能性分析2.2.2非功能性分析2.3 系统用例分析2.4 ......
  • springboot487基于springboot的城市垃圾分类管理系统(论文+源码)_kaic
    摘 要现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本城市垃圾分类管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务......
  • springboot学生选课系统(代码+数据库+LW)
    摘 要互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对学生选课信息管理混乱,出错率高,信息安全性差,劳动强度大,费时费力等问题,采用学生选课系统可以有效管理,使信息......