文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-07-06 13:28

关注

这篇文章主要介绍了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实现动态传参”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯