iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >springboot怎么通过spel结合aop实现动态传参
  • 552
分享到

springboot怎么通过spel结合aop实现动态传参

2023-07-06 13:07:12 552人浏览 八月长安
摘要

这篇文章主要介绍了SpringBoot怎么通过spel结合aop实现动态传参的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇springboot怎么通过spel结合aop实现动态传参文章都会有所收获,下面我们一起

这篇文章主要介绍了SpringBoot怎么通过spel结合aop实现动态传参的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇springboot怎么通过spel结合aop实现动态传参文章都会有所收获,下面我们一起来看看吧。

SpEl表达式简介

正式撸代码之前, 先了解下SpEl (Spring Expression Language) 表达式, 这是Spring框架中的一个利器.

Spring通过SpEl能在运行时构建复杂表达式、存取对象属性、对象方法调用等等.

举个简单的例子方便理解, 如下

//定义了一个表达式String expressionStr = "1+1";ExpressionParser parser = new SpelExpressionParser();Expression expression = parser.parseExpression(expressionStr);Integer val = expression.getValue(Integer.class);System.out.println(expressionStr + "的结果是:" + val);

通过以上案例, 不难理解, 所谓的SpEl, 本质上其实就是解析表达式.

实例: SpEl结合AOP动态传参

简单了解了SpEl表达式, 那么接下来我们就直接开始撸代码.

先引入必要的pom依赖, 其实只有aop依赖, SpEl本身就被Spring支持, 所以无需额外引入.

<dependency>          <groupId>org.springframework.boot</groupId>          <artifactId>spring-boot-starter-aop</artifactId></dependency>

定义一个SpEl的工具类SpelUtil

public class SpelUtil {        private static final SpelExpressionParser parser = new SpelExpressionParser();        private static final DefaultParameterNameDiscoverer nameDiscoverer = new DefaultParameterNameDiscoverer();        public static String generateKeyBySpEL(String spELStr, ProceedingJoinPoint joinPoint) {        // 通过joinPoint获取被注解方法        MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();        Method method = methodSignature.getMethod();        // 使用Spring的DefaultParameterNameDiscoverer获取方法形参名数组        String[] paramNames = nameDiscoverer.getParameterNames(method);        // 解析过后的Spring表达式对象        Expression expression = parser.parseExpression(spELStr);        // Spring的表达式上下文对象        EvaluationContext context = new StandardEvaluationContext();        // 通过joinPoint获取被注解方法的形参        Object[] args = joinPoint.getArgs();        // 给上下文赋值        for (int i = 0; i < args.length; i++) {            context.setVariable(paramNames[i], args[i]);        }        // 表达式从上下文中计算出实际参数值                return expression.getValue(context).toString();    }}

定义一个带参注解SpelGetParm

@Target({ElementType.METHOD, ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)public @interface SpelGetParm {    String parm() default "";    }

定义带参注解SpelGetParmAop

@Aspect@Slf4j@Componentpublic class SpelGetParmAop {    @PostConstruct    public void init() {        log.info("SpelGetParm init ......");    }        @Around("@annotation(spelGetParm)")    public Object beforeInvoce(ProceedingJoinPoint joinPoint, SpelGetParm spelGetParm) throws Throwable {        Object result = null;        // 方法名        String methodName = joinPoint.getSignature().getName();        //获取动态参数        String parm = SpelUtil.generateKeyBySpEL(spelGetParm.parm(), joinPoint);        log.info("spel获取动态aop参数: {}", parm);        try {            log.info("执行目标方法: {} ==>>开始......", methodName);            result = joinPoint.proceed();            log.info("执行目标方法: {} ==>>结束......", methodName);            // 返回通知            log.info("目标方法 " + methodName + " 执行结果 " + result);        } finally {        }        // 后置通知        log.info("目标方法 " + methodName + " 结束");        return result;    }

以上已经基本实现了案例的核心功能, 接下来我们使用该注解即可

定义一个实体User

@Getter@Setter@NoArgsConstructor@JSONSerialize@jsonInclude(Include.NON_NULL)public class User implements Serializable {    private static final long serialVersionUID = -7229987827039544092L;    private String name;    private Long id;}

我们在UserController直接使用该带参注解即可

@CrossOrigin@RestController@RequestMapping("/user")public class UserController {    @PostMapping("/param")    @SpelGetParm(parm = "#user.name")    public R repeat(@RequestBody User user) {        return R.success(user);    }}

最后请求

springboot怎么通过spel结合aop实现动态传参

springboot怎么通过spel结合aop实现动态传参

可以看出, 切面成功获取到了实体的name值“张三”.

关于“springboot怎么通过spel结合aop实现动态传参”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“springboot怎么通过spel结合aop实现动态传参”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网精选频道。

--结束END--

本文标题: springboot怎么通过spel结合aop实现动态传参

本文链接: https://www.lsjlt.com/news/358386.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • springboot怎么通过spel结合aop实现动态传参
    这篇文章主要介绍了springboot怎么通过spel结合aop实现动态传参的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇springboot怎么通过spel结合aop实现动态传参文章都会有所收获,下面我们一起...
    99+
    2023-07-06
  • springboot通过spel结合aop实现动态传参的案例
    目录前言SpEl表达式简介实例: SpEl结合AOP动态传参小结项目地址前言 基于SpingBoot框架中, 我们随处可以见的便是各种各样的功能注解, 注解的实现原理AOP之前有说过...
    99+
    2024-04-02
  • SpringBoot通过AOP与注解实现入参校验详情
    目录前言:注解标记通过AOP对方法进行增强测试Get请求测试POST请求解决方法代码再次测试POST请求前言: 问题源头: 在日常的开发中,在Service层经常会用到对某一些必填参...
    99+
    2024-04-02
  • SpringBoot中通过AOP整合日志文件的实现
    目录1.导入相关的依赖 2.log4j2 日志文件 3.dao层的接口以及实现类 4.Service层业务实现类 5.Controller层接口控制类 6.编写业务类增强类,加入一个...
    99+
    2024-04-02
  • 如何通过动态参数实现周报制作
    需求描述在货品交易系统里,用户不仅要看当天的交易情况,还需要查看一周 / 一个月 / 一年的情况,也叫做周报 / 月报 / 年报。下图所示就是其中订货信息周报的效果。它是如何根据用户输入的一个日期查询出该日期所在周的订货信息表的呢?实现步骤...
    99+
    2023-06-02
  • SpringBoot中怎么通过整合Redis实现管道
    这篇文章给大家介绍SpringBoot中怎么通过整合Redis实现管道,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1. Redis 之管道(pipeline)执行一个Redis命令,Redis客户端和Redis服务器...
    99+
    2023-06-20
  • Springboot+AOP怎么实现时间参数格式转换
    本文小编为大家详细介绍“Springboot+AOP怎么实现时间参数格式转换”,内容详细,步骤清晰,细节处理妥当,希望这篇“Springboot+AOP怎么实现时间参数格式转换”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习...
    99+
    2023-06-30
  • springboot怎么通过不同的策略动态调用不同的实现类
    这篇“springboot怎么通过不同的策略动态调用不同的实现类”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“springb...
    99+
    2023-06-29
  • SpringBoot结合Redis配置工具类实现动态切换库
    我使用的版本是SpringBoot 2.6.4 可以实现注入不同的库连接或是动态切换库 <parent> <groupId>org.s...
    99+
    2022-11-13
    SpringBoot Redis动态切换库 SpringBoot Redis配置工具类
  • Vue怎么通过监听滚动事件实现动态锚点
    本文小编为大家详细介绍“Vue怎么通过监听滚动事件实现动态锚点”,内容详细,步骤清晰,细节处理妥当,希望这篇“Vue怎么通过监听滚动事件实现动态锚点”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。具体效果如下:一、...
    99+
    2023-07-04
  • SpringBoot怎么整合SpringSecurityOauth2实现鉴权动态权限问题
    这篇文章主要介绍“SpringBoot怎么整合SpringSecurityOauth2实现鉴权动态权限问题”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SpringBoot怎么整合SpringSec...
    99+
    2023-07-02
  • springboot动态加载类怎么实现
    要实现Spring Boot动态加载类,可以使用以下步骤: 创建一个ClassLoader对象,用于动态加载类。可以使用URLC...
    99+
    2023-10-25
    springboot
  • SpringBoot怎么结合Redis实现序列化
    这篇文章主要介绍了SpringBoot怎么结合Redis实现序列化的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringBoot怎么结合Redis实现序列化文章都会有所收获,下面我们一起来看看吧。配置类配置...
    99+
    2023-07-02
  • Spring多数据源AOP动态切换怎么实现
    这篇文章主要讲解了“Spring多数据源AOP动态切换怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Spring多数据源AOP动态切换怎么实现”吧!一:新增多数据源类public c...
    99+
    2023-06-04
  • vue2.0结合Element怎么实现select动态控制input禁用
    这篇文章主要为大家展示了“vue2.0结合Element怎么实现select动态控制input禁用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“vue2.0结合...
    99+
    2024-04-02
  • Python中怎么通过@classmethod实现多态
    这篇文章主要介绍了Python中怎么通过@classmethod实现多态的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python中怎么通过@classmethod实现多态文章都会有所收获,下面我们一起来看看吧...
    99+
    2023-07-04
  • springboot aop配合反射统一签名验证怎么实现
    本篇内容主要讲解“springboot aop配合反射统一签名验证怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“springboot aop配合反射统一签名验证怎么实...
    99+
    2023-06-21
  • springboot动态加入注解怎么实现
    要在Spring Boot中动态加入注解,可以使用Java的动态代理技术和反射机制。以下是一个示例代码,演示如何在运行时动态加入注解...
    99+
    2023-09-26
    springboot
  • Springboot怎么通过Scheduled实现定时任务
    小编给大家分享一下Springboot怎么通过Scheduled实现定时任务,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!定时任务一般会存在中大型企业级项目中,为...
    99+
    2023-05-30
    springboot
  • SpringBoot通过ThreadLocal怎么实现登录拦截
    本篇内容主要讲解“SpringBoot通过ThreadLocal怎么实现登录拦截”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SpringBoot通过ThreadLocal怎么实现登录拦截”吧!...
    99+
    2023-06-30
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作