Spring cache 注解详解

2023-10-26

spring cache注解的使用:

@CacheConfig 类级别的缓存注解,允许共享缓存名称

@Caching 将多种缓存操作分组

@Cacheable 触发缓存入口

@CacahePut 更新缓存

@CacheEvict 触发移除缓存

最常用的为最后三个:@Cacheable、@CacheEvict、@CacheEvict

@CacheConfig:

       主要用于配置该类中会用到的一些共用的缓存配置。在这里@CacheConfig(cacheNames = "role"):配置了该数据访问对象中返回的内容将存储于名为role的缓存对象中,我们也可以不使用该注解,直接通过@Cacheable自己配置缓存集的名字来定义。

@Service
@CacheConfig(cacheNames = "role")
public class RoleService {

@Caching:

       主要可以让我们在一个方法或者类上同时指定多个Spring Cache相关的注解。其拥有三个属性:cacheable、put和evict,分别用于指定@Cacheable、@CachePut和@CacheEvict。

   @Caching(
            cacheable = @Cacheable("role"), 
            evict = { @CacheEvict("role2"),
                      @CacheEvict(value = "role", allEntries = true) 
                    },
            put = {
                    @CachePut(value = "role", key = "#role.id"),
                    @CachePut(value = "role", key = "#role.name"),
                    @CachePut(value = "role", key = "#role.account")
                  }
           )
   public Role find(Role role) {
      return null;
   }

@Cacheable:

一般用于查询操作,根据key查询缓存.

  1. 如果key不存在,查询db,并将结果更新到缓存中。
  2. 如果key存在,直接查询缓存中的数据。
  3. 需要注意的是当一个支持缓存的方法在对象内部被调用时是不会触发缓存功能的。
  4. @Cacheable可以指定三个属性,value、key和condition

        4.1  value属性指定Cache名称(如果通过@CacheConfig设置了缓存区域,此处可省略)

       value属性是必须指定的,其表示当前方法的返回值是会被缓存在哪个Cache上的,对应Cache的名称。其可以是一个Cache也可以是多个Cache,当需要指定多个Cache时其是一个数组。
   

   @Cacheable("cache1")//Cache是发生在cache1上的
   public Role find(Integer id) {
      returnnull;
   }

   @Cacheable({"cache1", "cache2"})//Cache是发生在cache1和cache2上的
   public Role find(Integer id) {
      returnnull;
   }

     4.2 使用key属性自定义key 

           key属性是用来指定Spring缓存方法的返回结果时对应的key的。该属性支持SpringEL表达式。当我们没有指定该属性时,Spring将使用默认策略生成key。

        4.2.1  默认生成策略:(也可自定义默认生成策略,通过配置文件,没用过,可自行百度)

          默认的key生成策略是通过KeyGenerator生成的,其默认策略如下:

  • 如果方法没有参数,则使用0作为key。
  • 如果只有一个参数的话则使用该参数作为key。
  • 如果参数多于一个的话则使用所有参数的hashCode作为key。

        4.2.2  自定义策略:

         自定义策略是指我们可以通过Spring的EL表达式来指定我们的key。这里的EL表达式可以使用方法参数及它们对应的属性。使用方法参数时我们可以直接使用“#参数名”或者“#p参数index”。下面是几个使用参数作为key的示例:

   @Cacheable(value="role", key="#id")
   public Role find(Integer id) {
      return null;
   }

   @Cacheable(value="role", key="#p0")
   public Role find(Integer id) {
      return null;
   }
 
   @Cacheable(value="role", key="#role.id")
   public Role find(Role role) {
      return null;
   }

   @Cacheable(value="role", key="#p0.id")
   public Role find(Role role) {
      return null;
   }

 除了上述使用方法参数作为key之外,Spring还为我们提供了一个root对象可以用来生成key。通过该root对象我们可以获取到以下信息。

属性名称

描述

示例

methodName

当前方法名

#root.methodName

method

当前方法

#root.method.name

target

当前被调用的对象

#root.target

targetClass

当前被调用的对象的class

#root.targetClass

args

当前方法参数组成的数组

#root.args[0]

caches

当前被调用的方法使用的Cache

#root.caches[0].name

当我们要使用root对象的属性作为key时我们也可以将“#root”省略,因为Spring默认使用的就是root对象的属性。如:  

   @Cacheable(value={"role", "xxx"}, key="caches[1].name")
   public Rolefind(Role role) {
      return null;
   }

4.3  condition  属性指定发生的条件

       有的时候我们可能并不希望缓存一个方法所有的返回结果。通过condition属性可以实现这一功能。condition属性默认为空,表示将缓存所有的调用情形。其值是通过SpringEL表达式来指定的,当为true时表示进行缓存处理;当为false时表示不进行缓存处理,即每次调用该方法时该方法都会执行一次。如下示例表示只有当role不为 null 时才会进行缓存

 @Cacheable(value = "role",key = "#roleId",condition = "#role != null")
 public Role selectRole(Integer roleId){
       Role role = new Role();
       role.setId(roleId);
       return roleMapper.selectOne(role);
 }

@CacahePut

@CachePut也可以声明一个方法支持缓存功能。与@Cacheable不同的是使用@CachePut标注的方法在执行前不会去检查缓存中是否存在之前执行过的结果,而是每次都会执行该方法,并将执行结果以键值对的形式存入指定的缓存中。

@CachePut也可以标注在类上和方法上。使用@CachePut时我们可以指定的属性跟@Cacheable是一样的

    @CachePut(value = "role",key = "#role.id",condition = "#role != null")
    public Role operateRole(Role role){
        Integer count = 0;
        if(role.getId() == null){
            count = roleMapper.insertSelective(role);
        }else{
            count = roleMapper.updateByPrimaryKeySelective(role);
        }
        if(count > 0){
            return roleMapper.selectByPrimaryKey(role.getId());
        }else{
            return null;
        }
    }

@CacheEvict

@CacheEvict是用来标注在需要清除缓存元素的方法或类上的。当标记在一个类上时表示其中所有的方法的执行都会触发缓存的清除操作。@CacheEvict可以指定的属性有value、key、condition、allEntries和beforeInvocation。其中value、key和condition的语义与@Cacheable对应的属性类似。下面我们来介绍一下新出现的两个属性allEntries和beforeInvocation:

  1.allEntries:表示是否需要清除缓存中所有的元素(非必需,默认为false。当为true时,会移除所有数据)

  2.beforeInvocation:清除操作默认是在方法成功执行之后触发的(非必需,默认为false,会在调用方法之后移除数据。当为true时,会在调用方法之前移除数据)

@CacheEvict(value = "role",key = "#roleId",allEntries = true,beforeInvocation = true)
public Integer deleteRole(Integer roleId){
    return roleMapper.deleteByPrimaryKey(roleId);
}

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring cache 注解详解 的相关文章

  • esp32微型计算机,基于ESP32的几款开发板

    ESP32是乐鑫推出的一款芯片 拥有40nm的工艺 双核32位MCU 2 4GHz双模Wi Fi和蓝牙芯片 主频高达230MHz 计算能力可达600DMIPS 下面为大家介绍一些基于ESP32的开发板 1 Heartypatch 一款基于E
  • 【Kafka】docker部署Kafka集群

    目录 Kafka概述 Kafka集群docker部署流程 简述 环境准备 部署流程 参考文献 Kafka概述 以下概述Kafka内的几个核心概念 可参考官方文档 有兴趣可读 kafka apache org Topic与日志 Topic 就
  • 第四篇、UDP消息发送

    文章目录 前言 一 UDP通信操作 二 代码示例 1 UDP消息发送 总结 前言 上一篇我们共同学习了TCP文件传输 本篇我们来学习UDP消息发送 一 UDP通信操作 发送方 1 建立一个socket连接 2 建立一个包 3 发送包 4 关
  • SSL VPN

    1 SSL工作过程是什么 第一阶段 客户端首先发送client hello消息到服务端 服务端收到client hello信息后 再发送server hello消息到客户端 随机数 32位时间戳 28字节随机序列 用于计算摘要信息和预主密钥
  • Java系列——封装、继承、多态初了解

    目录 一 前言 二 封装 1 什么是封装 2 封装的特点 3 封装的使用 三 继承 1 什么是继承 2 继承的特点 3 继承的优点 4 继承的使用 4 1 继承的格式 4 2 继承的演示 4 3 成员变量 4 4 成员方法 4 5 构造方法
  • Pyhton零售数据分析及产品关联分析

    一 项目背景 总结 项目背景 以购物篮分析为背景 分析某跨国棒球用品零售商的历史订单数据 为企业提供运营及销售策略 项目总结 一 本项目对企业历史订单数据进行以下角度的处理及分析 数据探索及清洗 对6w 订单数据进行探索及清洗处理 为数据构
  • 2022年最新前端面试题,持续更新

    js面试题 1 js数据类型 基本数据类型 Number String Boolean Null Undefined Symbol bigInt 引用数据类型 object Array Date Function RegExp 2 js变量
  • surf特征原理

    前言 也许我们使用过Uiautomator编写过自动化测试脚本 也许我们也使用过Monkey来测试过应用的稳定性 但在使用过程中总觉得有或多或小的问题 用Uiautomator写脚本 总觉得有时候控件没法识别 用Monkey来进行稳定性测试
  • Oracle SQL developer不显示dbms_output.put_line的输出内容

    1 调出dbms输出窗口 2 dbms选择对应的数据库连接 3 工作区SQL文件 定义一个触发器 create trigger newtmpdata 创建触发器newtmpdata 在tmp中添加新数据 after insert 插入操作之
  • yolo算法通俗易懂讲解

    参考 https blog csdn net briblue article details 103149407 depth 1 utm source distribute pc relevant none task utm source
  • .NET[C#]LINQ查询List集合中所有重复的元素如何实现?(转载)

    NET C LINQ查询List集合中所有重复的元素如何实现 转载 方案一 var query lst GroupBy x gt x Where g gt g Count gt 1 Select y gt y Key ToList 如果还需
  • C#,去除字符串指定的之字符,并去掉不可见的 “”一种方法。

    string str1 小王 心情 很 平 静 char chs1 new char 定义一个字符数组 存放上面字符串中不要的内容 和 string result1 str1 Split chs1 StringSplitOptions Re
  • 关于Adapter数据适配器

    适配器 什么是适配器 Android适配器是数据和视图之间的桥梁 以便于数据在View上显示 适配器就像显示器 把复杂的东西按人可以接受的方式来展现 Adapter数据适配器将各种数据以合适的形式绑定到控件上 像listview gridv
  • MyBatis框架——MyBatis执行SQL的两种方式(转载)

    本节主要介绍 MyBatis 执行 SQL 语句的两种方式和它们的区别 MyBatis 有两种执行 SQL 语句的方式 如下 通过 SqlSession 发送 SQL 通过 SqlSession 获取 Mapper 接口 通过 Mapper
  • ajax 无参请求,ajax无参请求学习

    ajax 点击 请求流程 test html代码流程 创建button按钮 为button绑定一个点击事件 函数 在函数内书写ajax代码 2 1 创建ajax对象 2 2 设置onreadystatechange属性 用来监听变化 如果有
  • 数据结构视频教程 -《数据结构视频教程 严蔚敏》

    整个视频打包下载地址 史上最全的数据结构视频教程系列分享之 数据结构视频教程 严蔚敏 转载请保留出处和链接 更多优秀资源请访问 我是码农 严蔚敏老师是清华大学计算机系教授 长期从事数据结构教学和教材建设 本教程是数据结构视频教程中的经典之作
  • Spring(十二):bean的加载——创建bean

    回顾 前面已经看了在加载Bean的时候 如何去解决循环依赖的问题 解决完循环依赖 就到创建Bean的步骤了 而创建bean的步骤是紧紧接着 创建Bean实例 Bean根据范围会分为几种 单例 原型 自定义范围 每种范围都会有自己不同的生命周
  • 【Altium designer】PCB 各层简介

    1 Signal Layer 信号层 主要用于放置元件和走线 Top Layer 顶层 Bottom Layer 底层 Mid Layer 中间信号层 2 Mechanical Layer 机械层 3 Keep Out Layer 禁止布线
  • Linux内核:内存管理——内存回收

    概述 当linux系统内存压力就大时 就会对系统的每个压力大的zone进程内存回收 内存回收主要是针对匿名页和文件页进行的 对于匿名页 内存回收过程中会筛选出一些不经常使用的匿名页 将它们写入到swap分区中 然后作为空闲页框释放到伙伴系统
  • c++学习之多态案例--电脑组装

    代码示例 include

随机推荐