Spring- Cache缓存
admin
2023-08-01 03:40:06
0


在操作缓存中,一般会有以下几种操作,在Spring的缓存中会对应有几种注解:


* 获取数据:从缓存获得需要数据,如果缓存没有则从数据库查询,再将其保存在缓存;

* 插入数据:先将数据插入数据库中,再保存到缓存中;

* 更新数据:先将数据更新到数据库中,再更新相应缓存数据;

* 删除数据:先从数据库中删除数据,再删除缓存中数据;


spring cache常用注解为:@Cacheable、@CachePut、@CacheEvit

@Cacheable 的作用:适用于获取数据,如果缓存中有数据,不在调用注解方法;

@CachePut 的作用:适合于插入数据和更新数据。一定会调用真实方法,再将方法返回值保存到缓存;

@CachEvict 的作用:适合于删除数据。


主要的参数

value缓存的名称,可以在 spring 配置文件中定义,必须指定至少一个例如:
@Cacheable(value=”mycache”) 或者
@Cacheable(value={”cache1”,”cache2”}
key缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合例如:
@Cacheable(value=”testcache”,key=”#userName”)
condition缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才进行缓存例如:
@Cacheable(value=”testcache”,condition=”#userName.length()>2”)


一、xml配置文件

//cacheManager为具体的缓存管理器例如RedisCacheManager

<cache:annotation-driven cache-mamage="cacheManager" />


二、项目中操作

@CacheConfig(cacheNames="prizeinfo")

@Service(value="springRedisService")

public class SpringRedisServiceImpl implements SpringRedisService{

     @Autowired

     private PrizeinfoService prizeinfoService;

    

     @Cacheable(key="'id:'+#id")

     public Prizeinfo getObject(int id) {

          return prizeinfoService.getPrizeinfoById(id);

     }

     @CachePut(key="'id:'+#o.id")

     public Prizeinfo insertObject(Prizeinfo o) {

         prizeinfoService.insertPrizeinfo(o);

          System.out.println("insertObject"+o.getId());

         return o;

     }

     @CacheEvict(key="'id:'+#id")

     public int deleteObjectById(int id) {

          prizeinfoService.deletePrizeinfoById(id);

          return id;

     }

}


三、Spring Cache原理:


 Spring Cache实际是利用Spring Aop原理来实现的。具体的执行流程和源码,下面将讲解


#标签会默认的创建什么对象??

1. 解析自定义缓存标签


1.1 利用springIoc先解析标签器类AnnotationDrivenCacheBeanDefinitionParser 。

//存储自定义标签和解析标签类的关系

CacheNamespaceHandler

//解析自定义的标签的解析器,将xml其生成beandefinition

BeanDefinitionParser

AnnotationDrivenCacheBeanDefinitionParser


1.2  AnnotationDrivenCacheBeanDefinitionParser解析方法parser,解析标签属性,创建对应BeanDefinition。(图解在https://www.processon.com/embed/58afa70be4b0793432a703c9)


//通知器自动代理生成器  名称:org.springframework.cache.config.internalCacheAdvisor

·InfrastructureAdvisorAutoProxyCreator

//缓存的基本操作

·AnnotationCacheOperationSource

//拦截器类  设置属性:cacheOperationSources

·CacheInterceptor

//通知器

//设置通知属性:adviceBeanName:CacheInterceptor  

//设置cacheOperationSource属性:AnnotationCacheOperationSource

·BeanFactoryCacheOperationSourceAdvisor



#注解的类是何时,通过什么方式和缓存关联的??

2. 注解缓存类SpringRedisServiceImpl 实例化对象


2.1 使用自动代理创建器的时机:


2.2 自动代理创建器的创建过程:


2.3 调用注解类:


相关内容

热门资讯

美中央司令部:超20艘美军舰艇... 当地时间7月8日,美军中央司令部在社交媒体发文称,目前有20多艘美国海军军舰正在中东各水域巡逻。美军...
伊朗称美军袭击造成8名军人死亡 总台记者8日自伊朗方面获悉,美军当天凌晨对伊朗南部部分地区发动袭击,造成伊朗军方8人死亡。据了解,死...
伊朗军方:若美国真的发动大规模... 美国对伊朗发动新一轮袭击,特朗普称美伊谅解备忘录失效,伊朗方面有何回应?凤凰卫视驻伊朗记者李睿从德黑...
河南社旗县近亿元高标准农田项目... 河南省社旗县地处南阳盆地东缘,有121万亩耕地,是全国产粮大县。2025年,这个常住人口约54万人口...
湖北鄂州一家3人被大风卷走身亡... 澎湃新闻记者 魏凡7月6日晚,湖北东部多地遭遇强对流天气袭击,部分乡镇出现龙卷风。鄂州名门世家小区6...
走访茉莉花都横州:大片花田浸泡... 受今年第10号台风“美莎克”持续影响,广西南宁横州市遭遇极端强降雨,境内多座水库出现漫顶及缺口情况、...
这场震惊世人的中国在德留学生性... “大多数人读起这个事情,他们会觉得这些人(加害者)一定是很可怕的人吧?但是其实不是,他们在生活中是非...
美国人,真的“不懂球”吗? 美国人为什么不喜欢足球?刘骁骞带着这个问题走进美墨边境、锈带水牛城和洛杉矶的球场。他发现足球在美国的...
特朗普:将向乌克兰授予制造爱国... 7月8日,在北约峰会记者会上,特朗普暗示欧洲和乌克兰可能获得“爱国者”导弹生产许可证。特朗普被问及,...
世界杯,玩脏的 作者 | 凌川儿 编辑 | 阿树FIFAmerica,一个由FIFA(国际足联)和America(美...