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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM