Java注解开发

注解开发

注解提供了更声明式和方便的方式,而编码方式允许更精细的控制和定制。

在Java中,当Redis充当缓存时,使用注解的方式更为常见和方便。Spring Framework提供了一种基于注解的缓存机制,称为Spring Cache。通过在方法上添加注解,开发人员可以指定缓存的行为,例如缓存的名称、缓存的过期时间等。使用注解的方式,开发人员可以在代码中更直观地定义缓存逻辑,而无需手动编写缓存代码。

Spring Cache提供了多个注解,最常用的是@Cacheable、@CachePut和@CacheEvict 。

  • @Cacheable 用于标记方法应该被缓存

  • @CachePut 用于将方法的结果存储到缓存中

  • @CacheEvict 用于从缓存中删除数据

1、添加依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2、添加配置 application.properties

spring.redis.host=localhost
spring.redis.port=6379
spring.cache.type=redis

3、定义配置类

@EnableCaching
@SpringBootConfiguration
public class MyRedisConfig {@Beanpublic RedisCacheManager redisCacheManager(RedisConnectionFactory factory) {GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer =
new GenericJackson2JsonRedisSerializer();StringRedisSerializer stringRedisSerializer = new
StringRedisSerializer();RedisCacheConfiguration config =
RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofSeconds(100)).serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(st
ringRedisSerializer)).serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(
genericJackson2JsonRedisSerializer));return RedisCacheManager.builder(factory).cacheDefaults(config).build();}
}

4、在方法上添加对应的注解,就可以达到缓存的目的

@Service
public class UserServImpl implements IUserServ{@Cacheable(value = "users",key = "#id") 设置所使用的key值为users::传入的参数id值public User load(Long id) {System.out.println("执行业务逻辑");User user=new User();user.setId(99L);user.setUsername("zhangsan");user.setPassword("123456");return user;}
}

注解Cacheable

@Cacheable注解主要针对方法配置,能够根据方法的请求参数和运行结果进行缓存,比如如果缓存中存在该值,则使用缓存数据, 如果不在缓存中,则执行业务逻辑处理,并将执行结果存入缓存

  • value/cacheNames:指定缓存空间的名称,比配属性。可二选一使用。

  • key:指定缓存中数据的key,默认使用方法参数值,也可使用SpEL表达式

  • keyGenerator:指定缓存数据的key的生成器,与key属性二选一使用

  • cacheManager:指定缓存的管理器

  • cacheResolver:指定缓存的解析器,与cacheManager属性二选一使用

  • condition:指定在符合某种条件下,进行数据缓存,不符合条件则不执行存储

  • unless:指定在符合某种条件下不进行数据缓存

  • sync:指定是否使用异步缓存,默认为false。

@CacheAable(value="dep",key="#department.id")//缓存所使用的key值由value和key共同组成,值为dept::再加上参数department对象中的id参数值
public Department listDepartment(Department department){System.out.println("加载信息:"+department);departmentDao.loadDepartment(department);return department;
}

如果方法的返回值为空时不执行缓存,则可以引入condition和unless设置缓存规则 @Cacheable(value= "users",key = "#id",condition = "#result!=null") 这里出现问题,解决方案使用

@Cacheable(value = "users",key = "#id",unless="#result == null")

  • condition对入参进行判断,符合条件的放入缓存,不符合的不缓存,condition能使用的只有#root和参数,不能使用返回结果

  • unless是对出参进行判断,符合条件的不缓存,不符合的放入缓存,而unless是可以使用#result的

注解EnableCaching

@EnableCaching主要用于开启基于注解的缓存支持,用在应用主类或者配置类上

@EnableCaching
@SpringBootConfiguration
public class MyRedisConfig{}

注解CacheConfig

@CacheConfig注解是加在类上,用于抽取缓存的公共配置。

在类头上加了@CacheConfig注解等同于每个方法上的缓存注解都加了cacheName或者value指定的组件,并且这个组件来自@CacheConfig,也就是用于统筹管理类中所有使用@Cacheable、@CachePut…和@CacheEvict 注解标注方法中的公共属性,这些公共属性包括有cacheNames、keyGenerator 、cacheManager和cacheResolver

@CacheConfig(cacheNames = "users") //等价于在每个缓存注解上添加了value="users"
@Service
public class UserServImpl implements IUserServ{@Cacheable(value="bbb",key = "#id",unless="#result == null") 
//在类上有定义,同时在方法上也有定义,则局部优先public User load(Long id) {}
}

注解CachePut

@CachePut该注解用于设置缓存。表示在调用方法的同时又更新缓存,它是默认先调用目标方法,然后将目标方法的运行结果存入缓存,不过需要注意的是如果要保持缓存同步更新,这个注解使用的key需要和缓存的key保持一致。

和@cacheable不同的是:

  • @Cacheable在运行在目标方法之前,而它是目标方法之后,因为它需要先拿到目标方法运行的结果

  • @Cacheable不可以使用#result,因为使用@Cacheable标注的方法不一定会被调用,可能获取不到result。

属性和@cacheable基本一致,就少了一个是否异步(sync)的属性

注解CacheEvict

@CacheEvict 该注解用于清理缓存。先进行方法调用,然后将缓存进行清除。例如

@CacheEvict(value=”users”,key=”#user.getName()”),其中的 Key 是用来指定缓存的 key 的

  • allEntries属性: 表示是否清除指定缓存中的所有键值对,既是否清除所有缓存,设置为true时会清除缓存中的所有键值对,默认为false,即根据key清除缓存。所以它与key属性二选一使用

  • beforeInvocation属性: 表示是否是在@CacheEvict注解的方法调用之前清除指定缓存,默认为false,即在方法调用之后清除缓存,设置为true时则会在方法调用之前清除缓存。在方法调用之前还是之后清除缓存的区别在于方法调用时是否会出现异常,若不出现异常,这两种设置没有区别,若出现异常,设置为在方法调用之后清除缓存将不起作用,因为方法调用失败了。

注解Caching

@Caching该注解可以对缓存清理、设置 操作打包。用于针对复杂规则的数据缓存管理,可以作用于类或方法,在@Caching注解内部包含有Cacheable、put和evict三个属性,分别对应于@Cacheable、@CachePut和@CacheEvict三个注解

@Caching(cacheable={@Cacheable(cacheNames ="comment",key = "#id")},put = {@CachePut(cacheNames = "comment",key.= "#result.author")}
)
public Comment getcoiment(int id){return commentRepository.findByld(id).get();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/16690.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法与数据结构-二分查找

文章目录 什么是二分查找二分查找的时间复杂度二分查找的代码实现简单实现&#xff1a;不重复有序数组查找目标值变体实现&#xff1a;查找第一个值等于给定值的元素变体实现&#xff1a;查找最后一个值等于给定值的元素变体实现&#xff1a;查找最后一个小于给定值的元素变体实…

大龄青年的浙大MBA读书梦——提面优秀190+的上岸经验分享

时间如白驹过隙&#xff0c;三十年的岁月也转瞬即逝&#xff0c;回首过往这三十年的人生路&#xff0c;没有大起大落&#xff0c;一直都是相对比较平稳。但这几年疫情原因&#xff0c;公司效益不好&#xff0c;不仅我们公司整个行业也都在裁员&#xff0c;为了让自己更具备竞争…

RSA非对称加密算法工具类

RSA非对称加密算法 工具类 package com.safedog.datasafe.system.utils;import cn.hutool.core.codec.Base64; import cn.hutool.crypto.SecureUtil; import cn.hutool.crypto.asymmetric.AsymmetricAlgorithm; import cn.hutool.crypto.asymmetric.KeyType; import cn.hutoo…

flask数据库操作

本文将详细介绍在Flask Web应用中如何设计数据库模型,并使用Flask-SQLAlchemy等扩展进行数据库操作的最佳实践。内容涵盖数据模型设计,ORM使用,关系映射,查询方法,事务处理等方面。通过本文,您可以掌握Flask数据库应用的基本知识。 Flask作为一个流行的Python Web框架,提供了高…

什么是架构 架构图

如何画架构图_个人渣记录仅为自己搜索用的博客-CSDN博客 什么是架构&#xff1f;要表达的到底是什么&#xff1f; Linus 03 年在聊到拆分和集成时有一个很好的描述&#xff1a; I claim that you want to start communicating between independent modules no sooner than you…

CAN转ETHERCAT网关将CAN 总线和 ETHERCAT 网络连接方法

由于好多现场会出现将CAN总线的设备接到EtherCAT网络中&#xff0c;由于协议的不相同&#xff0c;不能直接进行连接&#xff0c;现需一种能同时兼容CAN 总线和ETHERCAT网络的一种设备&#xff0c;由此捷米JM-ECT-CAN 是自主研发的一款 ETHERCAT 从站功能的通讯网关。该产品主要…

Selenium开发环境搭建

1.下载Python https://www.python.org/downloads/ 下载下来选择自己创建的路径进行安装&#xff0c;然后配置环境变量 cmd命令框查看 2.安装selenium cmd命令框输入&#xff1a; pip install selenium3.下载pycharm https://www.jetbrains.com/pycharm/download/#sec…

CSDN 编程竞赛六十五期题解

竞赛总览 CSDN 编程竞赛六十五期&#xff1a;比赛详情 (csdn.net) 吐槽&#xff1a;本期问题较多&#xff0c;体验较差。 竞赛题解 题目1、数组排序 给你一个整数数组 nums&#xff0c;请你将数组按照每个值的频率降序排序。如果有多个值的频率相同&#xff0c;请按照数值…

Helm KinD kubectl krew Istio急速安装

本篇更新网上许多安装失效的工具&#xff0c;如krew和KinD。 本篇测试使用时间为2023/7/20&#xff0c;基本都为最新版本或最新稳定版本。 前置 Helm 是 Kubernetes 的一个包管理工具&#xff0c;用于简化 Kubernetes 应用的部署和管理。Helm 使用名为 "chart" 的打…

搭建测试平台开发(一):Django基本配置与项目创建

一、安装Django最新版本 1 pip install django 二、创建Django项目 首先进入要存放项目的目录&#xff0c;再执行创建项目的命令 1 django-admin startproject testplatform 三、Django项目目录详解 1 testplatform 2 ├── testplatform  # 项目的容器 3 │ ├──…

getInputStream has already been called for this request 问题记录

问题背景 HttpServletRequest.getReader() HttpServletRequest.getInputStream() 不能在过滤器中读取一次二进制流&#xff08;字符流&#xff09;&#xff0c;又在另外一个Servlet中读取一次&#xff0c;即一个InputSteam(BufferedReader)对象在被读取完成后&#xff0c;将无…

Spark SQL报错: Task failed while writing rows.

错误 今天运行 Spark 任务时报了一个错误&#xff0c;如下所示&#xff1a; WARN scheduler.TaskSetManager: Lost task 9.0 in stage 3.0 (TID 69, xxx.xxx.xxx.com, executor 3): org.apache.spark.SparkException: Task failed while writing rows.at org.apache.spark.sq…

JAVA的回调机制、同步/异步调用

一、同步调用 同步调用是最基本的调用方式。类A的a()方法调用类B的b()方法&#xff0c;类A的方法需要等到B类的方法执行完成才会继续执行。如果B的方法长时间阻塞&#xff0c;就会导致A类方法无法正常执行下去。 二、异步调用 如果A调用B&#xff0c;B的执行时间比较长&#…

Linux系统下U盘打不开: No application is registered as handling this file

简述 系统是之前就安装好使用的Ubuntu14.04&#xff0c;不过由于某些原因只安装到了机械硬盘中&#xff1b;最近新买了一块固态硬盘&#xff0c;所以打算把Ubuntu系统迁移到新的固态硬盘上&#xff1b; 当成功的迁移了系统之后发现其引导有点问题&#xff0c;导致多个系统启动不…

区间预测 | MATLAB实现QRBiGRU双向门控循环单元分位数回归多输入单输出区间预测

区间预测 | MATLAB实现QRBiGRU双向门控循环单元分位数回归多输入单输出区间预测 目录 区间预测 | MATLAB实现QRBiGRU双向门控循环单元分位数回归多输入单输出区间预测效果一览基本介绍模型描述程序设计参考资料 效果一览 基本介绍 MATLAB实现QRBiGRU双向门控循环单元分位数回归…

C++队列queue用法详解

一、定义 queue是一种容器转换器模板&#xff0c;调用#include< queue>即可使用队列类。 二、queue初始化 queue<Type, Container> (<数据类型&#xff0c;容器类型>&#xff09; 初始化时必须要有数据类型&#xff0c;容器可省略&#xff0c;省略时则默认为…

golang 时间工具类

用不习惯也嫌麻烦每次都去操作时间&#xff0c;然后就自己写了个时间工具类 package timeutilimport ("time" )func New() *TimeUtil {return &TimeUtil{} }// TimeUtil 是时间操作工具类 type TimeUtil struct{}// GetFormattedDate 获取格式化的日期字符串 fun…

MySql004——MySQL 数据类型

和Java中的数据类型一样&#xff0c;MySQL中的字段也有数据类型一说 一、数值类型 类型 大小 范围&#xff08;有符号&#xff09; 范围&#xff08;无符号&#xff09; 用途TINYINT 1 Bytes (-128&#xff0c;127) (0&#xff0c;255) 小整…

团队任务管理器工具推荐:三款适合协作工作的首选

如果您是项目经理或领导一个小团队&#xff0c;那么每天要完成的任务列表似乎无穷无尽。对于任何规模的公司来说&#xff0c;在不依赖任何软件的情况下掌握任务管理的不同方面都是一项挑战。满足您项目管理需求的正确软件可以显著提高团队的生产力——无论您的团队规模或项目范…

微软亚研院提出模型基础架构RetNet或将成为Transformer有力继承者

作为全新的神经网络架构&#xff0c;RetNet 同时实现了良好的扩展结果、并行训练、低成本部署和高效推理。这些特性将使 RetNet 有可能成为继 Transformer 之后大语言模型基础网络架构的有力继承者。实验数据也显示&#xff0c;在语言建模任务上&#xff1a; RetNet 可以达到与…