Spring AOP使用方法&参数注释

时间:2017-10-04 04:29:01

标签: java spring annotations spring-aop

有没有办法让Spring AOP识别已经注释的参数的值? (不能保证传递给方面的参数顺序,所以我希望使用注释来标记需要用来处理方面的参数)

任何替代方法也非常有用。

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


@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface Key {
}

@Wrappable
public void doSomething(Object a, @Key Object b) {
    // something
}

@Aspect
@Component
public class MyAspect {
    @After("@annotation(trigger)" /* what can be done to get the value of the parameter that has been annotated with @Key */)
    public void trigger(JoinPoint joinPoint, Trigger trigger) { }

2 个答案:

答案 0 :(得分:2)

这是一个方面类的示例,它应该处理用 @Wrappable 注释标记的方法。调用包装器方法后,您可以迭代方法参数以查明是否使用 @Key 注释标记了任何参数。 keyParams 列表包含使用 @Key 注释标记的所有参数。

@Aspect
@Component
public class WrappableAspect {

    @After("@annotation(annotation) || @within(annotation)")
    public void wrapper(
            final JoinPoint pointcut,
            final Wrappable annotation) {
        Wrappable anno = annotation;
        List<Parameter> keyParams = new ArrayList<>();

        if (annotation == null) {
            if (pointcut.getSignature() instanceof MethodSignature) {
                MethodSignature signature =
                        (MethodSignature) pointcut.getSignature();
                Method method = signature.getMethod();
                anno = method.getAnnotation(Wrappable.class);

                Parameter[] params = method.getParameters();
                for (Parameter param : params) {
                    try {
                        Annotation keyAnno = param.getAnnotation(Key.class);
                        keyParams.add(param);
                    } catch (Exception e) {
                        //do nothing
                    }
                }
            }
        }
    }
}

答案 1 :(得分:0)

我们不能将参数注释值作为AOP的参数获取,就像我们为方法注释做的那样,因为注释不是实际的参数,在那里你只能引用实际的参数。

i18n>

此注释将为您提供Object(b)的值,而不是@Key注释的值。

我们可以通过这种方式获取参数注释的值

args(@Key b)