AOP+ 自定义注解 +SpringElExpress自研缓存组件

AOP+ 自定义注解 +SpringElExpress自研缓存组件

    • 背景
    • 前置知识
    • 改造代码

背景

思考下这段代码,想想项目中是不是到处存在
先查缓存,缓存里面有,直接返回;缓存没有,查数据库,并更新到缓存
思考:如何将缓存代码从业务代码中剥离,促使业务代码更简洁更易维护,可以把这部分通过AOP来统一处理
在这里插入图片描述

前置知识

提前预习一波 SpringEL 表达式
在这里插入图片描述

改造代码

首先配置

spring.datasource.url=jdbc:mysql://192.168.133.128:3306/wxpay?useUnicode=true&characterEncoding=utf-8&rewriteBatchedStatements=true&useSSL=false&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver#mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
mybatis-plus.mapper-locations=classpath*:mapper/*.xmlspring.data.redis.database=0
spring.data.redis.host=192.168.133.128
spring.data.redis.port=6379
spring.data.redis.password=123456
spring.data.redis.lettuce.pool.max-active=8
spring.data.redis.lettuce.pool.max-wait=-1ms
spring.data.redis.lettuce.pool.max-idle=8
spring.data.redis.lettuce.pool.min-idle=0

注解和切面定义

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Documented
public @interface MyRedisCacheAnnotation {String keyPrefix();String matchValue();
}
@Slf4j
@Aspect
@Component
public class MyRedisCacheAspect {@Resourceprivate RedisTemplate redisTemplate;@Pointcut("@annotation(com.example.demo.annotation.MyRedisCacheAnnotation)")public void cachePointCut() {}@Around("cachePointCut()")public Object doCache(ProceedingJoinPoint pjp) {Object result = null;try {// 获得重载后的方法名MethodSignature signature = (MethodSignature) pjp.getSignature();Method method = signature.getMethod();// 确定方法名后获得该方法上面的注解标签 MyRedisCacheAnnotationMyRedisCacheAnnotation annotation = method.getAnnotation(MyRedisCacheAnnotation.class);// 获取注解上配置的参数String keyPrefix = annotation.keyPrefix();String matchValue = annotation.matchValue();// SpringEL 解析器SpelExpressionParser spelExpressionParser = new SpelExpressionParser();Expression expression = spelExpressionParser.parseExpression(matchValue); // #idStandardEvaluationContext context = new StandardEvaluationContext();// 获得方法的形参个数Object[] args = pjp.getArgs();DefaultParameterNameDiscoverer defaultParameterNameDiscoverer = new DefaultParameterNameDiscoverer();String[] parameterNames = defaultParameterNameDiscoverer.getParameterNames(method);for (int i = 0; i < parameterNames.length; i++) {log.info("方法参数名称:{}, 值:{}", parameterNames[i], args[i].toString());context.setVariable(parameterNames[i], args[i].toString());}// 拼接 redis 的最终 key 形式String key = keyPrefix + ":" + expression.getValue(context).toString();log.info("key形式{}", key);// 先去 redis 看看有没有result = redisTemplate.opsForValue().get(key);if (result != null) {log.info("redis里有,直接返回了");return result;}result = pjp.proceed();if (result != null) {redisTemplate.opsForValue().set(key, result);}} catch (Throwable e) {e.printStackTrace();}return result;}
}

不要忘了重写 redisTemplate

@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory) {RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();redisTemplate.setConnectionFactory(lettuceConnectionFactory);redisTemplate.setKeySerializer(new StringRedisSerializer());redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());redisTemplate.setHashKeySerializer(new StringRedisSerializer());redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());redisTemplate.afterPropertiesSet();return redisTemplate;}
}

最后 service 层的效果,简便多了是不是

@Autowired
private UserMapper userMapper;@Override
@MyRedisCacheAnnotation(keyPrefix="user", matchValue="#id")
public User getUserById(Integer id) {return userMapper.selectById(id);
}

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

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

相关文章

区块链知识体系fisco-bcos实战

文章目录 一、区块链发展概述及类型和特征1.1 区块链的概念1.2 区块链的起源1.3 区块链的发展历程1.4 区块链的类型和特征 二、区块链的常见技术架构2.1 技术架构2.2 核心技术 三、区块链的常见应用3.1 生态环境监测3.2 医疗废弃物追踪解决3.3 区块链在电子政务领域的应用3.4 在…

mac安装ipa包【金铲铲为例】

mac安装ipa包 安装PlayCover 链接&#xff1a;https://github.com/PlayCover/PlayCover 1、点最新Releases 2、cmd ↓&#xff0c;拉到最下面下载dmg 3、安装 图标拖拽到Applications里 IPA下载 以金铲铲为例&#xff0c;良心砸壳包站点&#xff0c;有能力可以支持一下…

Modbus-TCP——Libmodbus安装和使用(Ubuntu22.04)

1、简介 Modbus是一种通信协议&#xff0c;广泛用于工业自动化和过程控制领域&#xff0c;允许不同设备之间进行数据交换。libmodbus是一个用于 Modbus 协议的开源库&#xff0c;主要用于开发和实现 Modbus 协议的客户端和服务器应用程序。libmodbus 以 C 语言编写&#xff0c…

Gartner发布2024年终端和工作空间安全成熟度曲线:24项相关技术发展和应用状况及趋势

由于攻击者使用人工智能来增强网络钓鱼和终端攻击&#xff0c;企业需要高级安全措施来阻止入侵行为。此技术成熟度曲线可帮助安全和风险管理领导者识别可增强终端和工作空间保护的技术。 需要知道什么 网络安全创新层出不穷&#xff0c;但区分真正的进步与短暂的趋势却很困难。…

66 IPV4/6 OSPFV2/3 实操

一 网络括谱图 二 IPV6 一 华为IPV6地址的配置思路 1 全局上开启IPV6功能 # ipv6 # 2 在指定的接口上配置IPV6地址上的接口上配置IPV6地址 ipv6 enable 3 在接口上配置IPV6地址 ipv6 address 2001:1::254/64 脚本 # interface GigabitEthernet0/0/1 ipv6 enable ip add…

Ajax基础案例

接口文档 欢迎使用 - AJAX阶段 地区查询 图解 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewpor…

libLZMA库iOS18平台编译

1.下载xz源码: 使用autogen.sh生成configure文件 2.生成makefile rm -rf ./build/iOS && mkdir -p ./build/iOS && cd ./build/iOS && ../../configure --host=arm-apple-darwin64 --prefix=`pwd`/Frameworks/lzma CC="xcrun -sdk iphoneos cl…

熟悉Labview工具用

目录复制 目录 0.0&#xff1a;快捷键0.1&#xff1a;全局非图标显示0.2&#xff1a;小技巧&#xff1a;图片导入为程序1.2&#xff1a;事件结构1.2.0&#xff1a;超时分支&#xff1a;当事件结构框左上角设置为1时&#xff0c;单位毫秒&#xff0c;即理解为1ms内没有其他的事件…

ES+FileBeat+Kibana日志采集搭建体验

1.环境准备 需要linux操作系统&#xff0c;并安装了docker环境 此处使用虚拟机演示。&#xff08;虚拟机和docker看参考我之前写的文章&#xff09; VirtualBox安装Oracle Linux 7.9全流程-CSDN博客 VirtualBox上的Oracle Linux虚拟机安装Docker全流程-CSDN博客 简单演示搭建ES…

Linux_Shell三剑客grep,awk,sed-08

三剑客的概述&#xff1a; awk、grep、sed是linux操作文本的三大利器&#xff0c;合称文本三剑客&#xff0c;也是必须掌握的linux命令之一。三者的功能都是处理文本&#xff0c;但侧重点各不相同&#xff0c;其中属awk功能最强大&#xff0c;但也最复杂。grep更适合单纯的查找…

好用又便宜的平替苹果笔推荐:2024开学季盘点五款高性价比电容笔

​随着网络学习的不断发展&#xff0c;电容笔是一种常见的数字书写工具&#xff0c;受到许多学生党广泛欢迎&#xff0c;因为它可以与平板电脑完美配对&#xff0c;满足用户在平板上的书写、绘画等需求。可是原装笔的价格略贵&#xff0c;平替苹果笔的品牌又很多&#xff0c;很…

Java:循环练习

目录 1. 回文判断 2. 减法求商余 3. 求平方根 4.求质数 5. 猜数字 1. 回文判断 输入一个数字&#xff0c;判断是否为回文&#xff0c;回文就是正着读和反着读都一样&#xff0c;如121是回文&#xff0c;123则不是。 import java.util.Scanner;public class DemoNew {publ…

LUA的使用

背景 LUA刚流行起来的时候&#xff0c;想学习一下LUA。就找了一款使用LUA脚本引擎的游戏玩。希望从中了解LUA的使用 结果 熟悉了LUA的同时也熟悉了这款游戏。 准备工作 使用detoured withdll注入LUAK.dll。LUAK.dll用于管理LUA环境 procedure PROCESS_ATTACH(); stdcall …

Python 实现自定义异常

在Python编程中&#xff0c;异常处理是保证程序健壮性的重要机制。Python提供了一些内置的异常类&#xff0c;如ValueError、TypeError、IndexError等&#xff0c;开发者可以直接使用这些类来捕获和处理程序运行中出现的各种错误。然而&#xff0c;某些场景下&#xff0c;内置的…

无人机使用材料与结构特点详解,看完这篇文你就懂了!!!

一、常用材料 无人机的常用材料主要包括机身材料&#xff08;结构材料和非结构材料&#xff09;、发动机材料和涂料&#xff0c;其中最主要的是机身结构材料和发动机材料。 机身结构材料 低速无人机&#xff1a;主要使用木材、塑料、玻璃纤维或碳纤维复合材料蜂窝夹层结构。…

SQL Server数据库查询常用语句汇总

这里&#xff0c;汇总了在使用SQL Server数据库的过程中经常会写的查询语句。 情形1 根据时间查询最新一条数据 &#xff08;dtime类型为datetime&#xff09; select top 1 名称 as name,列名1 as parname1,列名2 as parname2,dtime,col1,col2 from demo order by dtime …

【基础算法总结】多源 BFS_多源最短路问题

多源 BFS_多源最短路问题 1.多源 BFS_多源最短路问题2.01 矩阵3.飞地的数量4.地图中的最高点5.地图分析 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&…

NtripShare全站仪自动化监测之气象改正

最近有幸和自动化监测领域权威专家进行交流&#xff0c;讨论到全站仪气象改正的问题&#xff0c;因为有些观点与专家不太一致&#xff0c;所以再次温习了一下全站仪气象改正的技术细节。 气象改正的概念 全站仪一般利用光波进行测距&#xff0c;首先仪器会处理测距光波的相位漂…

SpingBoot 两种方式配置多数据源

第一种&#xff1a;使用与MyBaits-Plus师出同门的“dynamic-datasource-spring-boot-starter” 官网地址&#xff1a; 基础必读&#xff08;免费&#xff09; dynamic-datasource 看云 1&#xff1a;引入依赖 <!-- 苞米豆多数据源 --> <dependency><group…

科技大厂对AI的垄断

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…