用另一个方面包装spring方面

用另一个方面包装spring方面,spring,annotations,aop,wrapper,aspectj,Spring,Annotations,Aop,Wrapper,Aspectj,我在函数runFunc上声明了两个方面作为foo和bar,我想在foo中捕获运行函数runcFunc和bar所花费的时间,但它只捕获runFunc的时间栏独立运行 我希望如果我在一个函数上放置两个注释,第一个注释应该包装第二个注释,第二个注释应该包装函数runfunc。如何实现这一点?事实证明,方面可以像包装函数一样轻松地包装其他方面 下面的代码有效 @Target({ElementType.METHOD, ElementType.TYPE}) @Retention(value = Retent

我在函数
runFunc
上声明了两个方面作为
foo
bar
,我想在
foo
中捕获运行函数
runcFunc
bar
所花费的时间,但它只捕获
runFunc
的时间<代码>栏独立运行


我希望如果我在一个函数上放置两个注释,第一个注释应该包装第二个注释,第二个注释应该包装函数
runfunc
。如何实现这一点?

事实证明,方面可以像包装函数一样轻松地包装其他方面

下面的代码有效

@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

事实证明,方面可以像包装函数一样轻松地包装其他方面

下面的代码有效

@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

嗨,潘卡吉。您让我回答这个问题,但我必须假设您这样做的原因是为了发现非平凡代码中的性能问题。如果那不是你的目标,我帮不了你什么忙。如果这是你的目标,我认为一个更有效的方法不是测量(像这个代码),而是。您让我回答这个问题,但我必须假设您这样做的原因是为了发现非平凡代码中的性能问题。如果那不是你的目标,我帮不了你什么忙。如果这是你的目标,我认为一个更有效的方法不是测量(像这个代码),而是测量。