SpEL结合AOP示例
AOP不用多说,是spring框架的两大基石之一。SpEL是Spring Expression Language的缩写,意为Spring表达式语言,,其支持在运行时查询和操作对象图提供了更加丰富的功能,最特别的是方法调用与字符串模板功能。熟悉js的es6语法的小伙伴都知道,模板字符串,这个spel就类似js的模板字符串。
本次代码主要是熟悉使用语法,并布对应实际的应场景。
一、自定义注解
@Target({ElementType.PARAMETER,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface TestAopAnn {/*** spEL* @return*/String spEL() default "";
}
二、自定义切面
@Aspect
@Component
public class TestAopAspect {private final static Logger LOGGER = LoggerFactory.getLogger(TestAopAspect.class);@Pointcut("@annotation(org.example.boot3.aop.TestAopAnn)")public void pointCut(){}@AfterReturning(value = "pointCut()",returning = "result")public void doAfter(JoinPoint joinPoint,Object result){Method method = getMethod(joinPoint);TestAopAnn annotation = method.getAnnotation(TestAopAnn.class);if(annotation!=null){LOGGER.info("TestAopAspect-->doAfter-------后置织入");/// 通过spel表达式获取到形参的中name的值String value =getValue(joinPoint, method, annotation.spEL());LOGGER.info("TestAopAspect-->doBefore-------value={}",value);/// 将name追加到返回的listtry {if(result!=null && result instanceof List){List list = (List) result;list.add(value);}} catch (Exception e) {e.fillInStackTrace();}}}private Method getMethod(JoinPoint joinPoint) {Signature signature = joinPoint.getSignature();MethodSignature methodSignature = (MethodSignature) signature;return methodSignature.getMethod();}/**解析spel*/private String getValue(JoinPoint joinPoint, Method method,String elStr){StandardEvaluationContext context = new StandardEvaluationContext();DefaultParameterNameDiscoverer parameterNameDiscoverer = new DefaultParameterNameDiscoverer();/// 方法参数名称String[] parameterNames = parameterNameDiscoverer.getParameterNames(method);Assert.isTrue(parameterNames!=null,"参数列表不能为空");///方法参数值Object[] args = joinPoint.getArgs();for (int i = 0; i < parameterNames.length; i++) {context.setVariable(parameterNames[i],args[i]);}ExpressionParser parser = new SpelExpressionParser();Expression expression = parser.parseExpression(elStr);return (String) expression.getValue(context);}
}
三、测试接口
public class TestReqVO {private String name;private String remark;
}
@RestController
@RequestMapping("/api")
public class RestApi {/*** SpEL 调用对象方法* @param vo* @return*/@GetMapping("/testSpEL1")@TestAopAnn(spEL = "#vo.getName()")public List<String> getSpELList1(TestReqVO vo){String[] arr = { "C" ,"C++","JAVA","GoLang","Rust","Python"};return new ArrayList<>(Arrays.stream(arr).toList());}/*** SpEL 调用对象属性* @param vo* @return*/@GetMapping("/testSpEL2")@TestAopAnn(spEL = "#vo.name")public List<String> getSpELList2(TestReqVO vo){String[] arr = { "C" ,"C++","JAVA","GoLang","Rust","Python"};return new ArrayList<>(Arrays.stream(arr).toList());}@GetMapping("/fluxList")public Flux<List<String>> getSpEL2(){String[] arr = { "C" ,"C++","JAVA","GoLang","Rust","Python"};ArrayList<String> list = new ArrayList<>(Arrays.asList(arr));return Flux.just(list);}}

相关文章:
SpEL结合AOP示例
AOP不用多说,是spring框架的两大基石之一。SpEL是Spring Expression Language的缩写,意为Spring表达式语言,,其支持在运行时查询和操作对象图提供了更加丰富的功能,最特别的是方法调用与字符串模板功能。熟悉js的es6语…...
【Linux:环境变量】
目录 命令行参数: 环境变量: 命令行参数: argv是一个char*类型的数组,里面存放着字符、字符串的指针地址,且该数组必定是以NULL结尾 命令行中启动的进程都是Bash的子进程,命令行参数的存在本质上就是通过…...
8月9日笔记
8月9日笔记 什么是代理? “代理”通常指的是“网络代理”,它是一种特殊的网络服务,允许一个网络终端(一般为客户端)通过这个服务与另一个网络终端(一般为服务器)进行非直接的连接。代理服务器作为中间人…...
API 签名认证:AK(Access Key 访问密钥)和 SK(Secret Key 私密密钥)
API签名认证 在当今的互联网时代,API作为服务与服务、应用程序与应用程序之间通信的重要手段,其安全性不容忽视。你是否遇到过需要在HTTP请求中加入访问密钥(ak)和私密密钥(sk)的情况?是不是担心这些敏感信息会被拦截或者泄露?本…...
Redis 单机和集群环境部署教程
目录 一、Redis 单机环境部署1. 环境准备2. 安装 Redis2.1 安装依赖2.2 下载并编译 Redis2.3 配置 Redis2.4 设置 Redis 为系统服务 3. Redis 配置选项详解4. 注意事项 二、Redis 集群环境部署1. 环境准备2. 安装 Redis3. 配置 Redis 集群3.1 配置文件调整3.2 启动 Redis 实例3…...
华为hcip-big data 学习笔记《一》大数据应用开发总指导
一、大数据应用开发总指导 1. 前言 随着大数据技术的飞速发展和大数据应用的不断普及,大数据已经成为当今时代最热门的话题之一。不过对于大数据的了解,很多人还只是停留在表面,提到大数据,很多人只是直到它是最新的科技&#x…...
用户画像架构图
背景 本文讲述下实现一个画像平台的架构图 架构图 这里面的人群圈选我们这里主要采用ck和spark,不过也有很多使用es,如果使用es的话,需要把标签的数据也存储到es的表中,类似我们这里放到ck的表中一样,这样就可以通过…...
37.x86游戏实战-XXX遍历怪物数组
免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 工具下载: 链接:https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…...
go语言中map为什么不会自动初始化?
go语言中map为什么不会自动初始化? 在Go语言中,map类型不会自动初始化的原因在于其设计哲学和类型系统。以下是具体原因: 零值设计:Go语言中的每种类型都有一个零值,例如整型的零值是0,布尔型的零值是fals…...
大数据面试SQL(一):合并日期重叠的活动
文章目录 合并日期重叠的活动 一、题目 二、分析 三、SQL实战 四、样例数据参考 合并日期重叠的活动 一、题目 已知有表记录了每个品牌的活动开始日期和结束日期,每个品牌可以有多个活动。请编写一个SQL查询合并在同一个品牌举行的所有重叠的活动,…...
stm32应用、项目、调试
主要记录实际使用中的一些注意点。 1.LCD 1.LCD1602 电路图: 看手册:电源和背光可以使用5v或者3.3v,数据和控制引脚直接和单片机引脚连接即可。 单片机型号:stm32c031c6t6 可以直接使用推完输出连接D0--D7,RS,EN,RW引脚&#…...
WEB渗透-未授权访问篇
WEB渗透未授权访问篇-Redis-CSDN博客 activemq 默认端口8161,默认账户密码admin/admin http://1.1.1.1:8161/admin/connections.jsp PUT /fileserver/%2F%2F2%083.jsp HTTP/1.0 Content-Length: 27 Host: 1.1.1.1:8161 Connection: Close Authorization: Basic YW…...
x86_64、AArch64、ARM32、LoongArch64、RISC-V
以下是对 x86_64、AArch64、ARM32、LoongArch64 和 RISC-V 这几种计算机架构的介绍,包括它们的应用场景、优缺点: 1. x86_64 简介: x86_64 是由 AMD 推出的 64 位扩展版 x86 架构,兼容于英特尔的 IA-32 架构。这一架构被广泛应用于桌面和服…...
git push上不去的问题Iremote reiectedl——文件过大的问题
在新建分支的时候,发现push怎么也上传不上去,一开始觉得是权限的问题,但是尝试了各种方案都没有用,后面再仔细看了一下是文件太大了,远程拒绝推送 接下来,和大家讲讲我的解决方案 1、把修改的代码迁移到新…...
Qt Creator卡顿
删除IDE的配置参数的保存文件夹QtProject,使得Qt Creator恢复出厂值。 C:\Users\替换为你的用户名\AppData\Roaming\QtProject 参考链接: Qt Creator 卡顿 卡死...
数据结构笔记(其五)--串
目录 12.串 12.1 基本操作 12.2 串的存储结构 12.3 字符串的模式匹配算法 (1).朴素模式匹配算法 (2).KMP算法 i.next[]数组的求解 ii.next[]数组的优化——nextval数组 iii.手算nextval数组 iiii.机算nextval数组 + KMP函数 12.串 串,即字符串(string),由零个或多…...
Python爬取高清美女图片
文章概述 本文将详细介绍如何使用Python编写一个简单的爬虫来抓取高清美女图片。我们将利用requests库来发送HTTP请求,使用BeautifulSoup库来解析HTML文档,从而提取出图片的URL并将其下载到本地。 技术栈 Python: 编程语言requests: HTTP客户端库Beau…...
gin路由
1主文件 package main import ("github.com/gin-gonic/gin""godade/user""net/http" ) func main() {router : gin.Default()router.GET("/", func(c *gin.Context) {c.String(http.StatusOK, "Hello World")})v1 : router…...
达梦数据库操作以及报错修改
执行失败(语句1) -6105:: 数据类型不匹配 第12 行附近出现错误 插入sql语句 INSERT INTO "by_ioc_rbac"."user_info" ("user_account", "user_name", "birthday", "password", "gender", "mobi…...
江科大/江协科技 STM32学习笔记P21
文章目录 ADC模数转换器ADC简介逐次逼近型ADCSTM32的ADCADC基本结构输入通道转换模式单次转换,非扫描模式连续转换,非扫描模式单次转换,扫描模式连续转换,扫描模式 触发控制数据对齐转换时间校准硬件电路电位器产生可调电压的电路…...
基于STM32F与ESP8266的智能桌面天气时钟:从网络授时到OLED显示的完整实现
1. 项目背景与核心功能 最近在工作室捣鼓了一个特别实用的小玩意儿——用STM32F和ESP8266做的智能桌面天气时钟。这可不是普通的电子钟,它能自动联网校准时间,还能实时显示当地天气,放在书桌上既美观又实用。很多朋友看到后都问我是怎么做的&…...
Kivy中文显示乱码?3步搞定字体配置(附免费字体下载)
Kivy中文显示乱码?3步搞定字体配置(附免费字体下载) 当你在Kivy应用中看到中文变成一堆问号或方框时,别急着怀疑人生——这通常是字体配置的小问题。作为Python生态中最受欢迎的跨平台GUI框架之一,Kivy默认使用Roboto字…...
OpenSees数值模拟从入门到进阶:理论、代码与实践
OpenSees数值模拟从入门到进阶:理论、代码与实践 摘要 OpenSees(Open System for Earthquake Engineering Simulation)作为开源的地震工程模拟系统,凭借其强大的非线性分析能力和开放的架构,已成为结构地震响应分析领域的重要工具。本文系统介绍OpenSees数值模拟的基本原…...
猫抓cat-catch:高效媒体捕获与资源下载全指南
猫抓cat-catch:高效媒体捕获与资源下载全指南 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 猫抓cat-catch是一款专注于网页媒体资源捕…...
秋招简历模板下载怎么选?6款主流简历模板工具深度测评
秋招季来临,对应届生来说,简历是踏入职场的第一块敲门砖,而一份贴合岗位需求、契合HR筛选思路的简历模板,既能降低简历制作难度,也是提高简历初筛通过率的关键。如今市面上的简历模板工具五花八门,功能定位…...
地理计算引擎GeographicLib全解析:从场景应用到算法原理
地理计算引擎GeographicLib全解析:从场景应用到算法原理 【免费下载链接】geographiclib Main repository for GeographicLib 项目地址: https://gitcode.com/gh_mirrors/ge/geographiclib 一、核心场景应用解析:解决真实世界地理难题 在航海导航…...
电商评论分析利器:GTE文本向量实战情感分析与产品问题挖掘
电商评论分析利器:GTE文本向量实战情感分析与产品问题挖掘 1. 电商评论分析的痛点与解决方案 电商平台每天产生海量用户评论,这些评论蕴含着消费者真实的产品体验和市场反馈。传统的人工分析方法面临三大挑战: 处理效率低:人工…...
PrismML发布1比特模型:突破大模型运行困境,提升智能密度
【导语:大型模型在智能手机和数据中心运行面临难题,PrismML构建超密集智能解决方案,推出1比特Bonsai系列模型,内存占用、速度、能耗等方面表现出色,重塑模型设计方式。】超密集智能:解决大模型运行难题大型…...
终极Redis可视化工具:Another Redis Desktop Manager完全使用指南
终极Redis可视化工具:Another Redis Desktop Manager完全使用指南 【免费下载链接】AnotherRedisDesktopManager 🚀🚀🚀A faster, better and more stable Redis desktop manager [GUI client], compatible with Linux, Windows, …...
FASTDDS-Python 实战:从零构建分布式通信环境
1. 为什么选择Fast DDS-Python? 在物联网和机器人系统中,设备间的实时通信是个硬需求。想象一下,你正在开发一个智能仓储机器人系统,需要让多台机器人在复杂环境中协同工作。这时候,传统的HTTP请求-响应模式就显得力不…...
