如何在java中将值传递给自定义注释?

时间:2017-09-15 09:19:23

标签: java spring

我的自定义注释是:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CacheClear {

    long versionId() default 0;
}

我希望实现类似的功能,我可以将方法参数“versionTo”传递给我的自定义注释。

@CacheClear(versionId = {versionTo})
public int importByVersionId(Long versionTo){
    ......
} 

我该怎么办?

2 个答案:

答案 0 :(得分:4)

可能。

注释需要常量值,方法参数是动态的。

答案 1 :(得分:1)

您不能传递值,但是可以在Spring Expression中传递该变量的路径,并使用 AOP的 JoinPointReflection来获取和使用它。请参阅以下内容:

您的注释:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CacheClear {

    String pathToVersionId() default 0;
}

注释用法:

@CacheClear(pathToVersionId = "[0]")
public int importByVersionId(Long versionTo){
    ......
} 

方面类:

@Component
@Aspect
public class YourAspect {

   @Before ("@annotation(cacheClear)")
   public void preAuthorize(JoinPoint joinPoint, CacheClear cacheClear) {
      Object[] args = joinPoint.getArgs();
      ExpressionParser elParser = new SpelExpressionParser();
      Expression expression = elParser.parseExpression(cacheClear.pathToVersionId());
      Long versionId = (Long) expression.getValue(args);

      // Do whatever you want to do with versionId      

    }
}

希望这可以帮助想要做类似事情的人。