zoukankan      html  css  js  c++  java
  • Spring框架根据传入参数动态的修改注解属性的值

    由于业务需要,需要在自定义注解中将参数中的值传入到注解的指定属性中,这很容易让我联想到 Spring 的 SpEL. 虽然根据反射也能得到相同结果,但是有更好的工具为什么不用呢?因此根据网上大神的攻略,整合出模拟版的 SpEL 使用.

    • 开发环境 JDK1.8
    • spring版本 5.0.6.RELEASE

    POM引入

    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.8.13</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-expression</artifactId>
        <version>5.0.6.RELEASE</version>
    </dependency>
    

    这里我引入的是 spring boot的相关版本,为了具有通用性, 因此精确到实际使用的引入和版本

    主要代码片段

    @AfterReturning(value = "@annotation(primaryKey)")
    public void doAfter(JoinPoint joinPoint, PrimaryKey primaryKey) throws Exception {
        ExpressionParser parser=new SpelExpressionParser();
        EvaluationContext ctx = new StandardEvaluationContext();
        
        //获取方法的参数名和参数值
        Signature signature = joinPoint.getSignature();
        MethodSignature methodSignature = (MethodSignature) signature;
        List<String> paramNameList = Arrays.asList(methodSignature.getParameterNames());
        List<Object> paramList = Arrays.asList(joinPoint.getArgs());
    
        //将方法的参数名和参数值一一对应的放入上下文中
        for (int i = 0; i < paramNameList.size(); i++) {
            ctx.setVariable(paramNameList.get(i), paramList.get(i));
        }
    
        //解析SpEL表达式获取值
        String value = parser.parseExpression(primaryKey.primaryKey()).getValue(ctx).toString();
        //解析后的业务代码
        ...
    }
    

    这个地方,我是在方法执行完毕后的切面中进行操作, 可以根据业务需要自行决定在哪里使用. 代码中的 primaryKey.primaryKey() 分别是我所自定义的注解名和注解属性d

  • 相关阅读:
    ASP.Net 2.0窗体身份验证机制详解(FormsAuthentication) (转载)
    获取页面得所有控件
    标题: 如何断开与另一台机器的连接(更换用户名和口令)
    C#数据类型及范围
    常用数学符号读法大全
    理解偏序关系
    理解全序关系
    理解拟序关系
    《离散数学》双语专业词汇表 名词术语中英文索引
    ORL人脸库
  • 原文地址:https://www.cnblogs.com/cbzj/p/9446864.html
Copyright © 2011-2022 走看看