用另一个方面包裹弹簧方面

时间:2017-05-19 12:45:53

标签: spring annotations aop wrapper aspectj

我已宣布两个方面为foo&关于函数bar的{​​{1}}我希望捕获运行函数runFunc& runcFunc中的Bar,但它只捕获Foo的时间。 runFunc正在独立运行。

我想要如果我在函数上放置两个注释,第一个注释应该包装第二个注释,第二个注释应该包含函数Bar。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:0)

事实证明,方面可以包装其他方面,就像它们可以包装函数一样容易。

以下代码有效。

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(value = RetentionPolicy.RUNTIME)
public @interface Foo {}


@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(value = RetentionPolicy.RUNTIME)
public @interface Bar {}


@Aspect
@Component
public class A {

    @Around("@annotation( foo )")
    public void func1(final ProceedingJoinPoint pjp, Foo foo) throws Throwable {
        System.out.println("foo start");
        pjp.proceed();
        System.out.println("foo end");
    }
}


@Aspect
@Component
public class B {

    @Around("@annotation( bar )")
    public void func2(final ProceedingJoinPoint pjp, Bar bar) throws Throwable {
        System.out.println("bar start");
        pjp.proceed();
        System.out.println("bar end");
    }
}

以下代码:

@Foo
@Bar
public void runFunc(){
    System.out.println("Inside Run.runFunc");
}

输出以下内容:

foo start
bar start
Inside Run.runFunc
bar end
foo end