Spring Boot和AspectJ - 我可以拦截对java.util.ArrayList.size()方法的调用吗?

时间:2018-05-28 15:50:11

标签: java spring-boot aop aspectj

我正在使用Spring Boot学习AOP,我觉得我对这个概念有很好的处理。我能够拦截对我创建的方法的调用,但是在其他库中找到的方法(例如“java.util.ArrayList.size()”)。是否也可以拦截对这些方法的调用?如果是这样,那么这个方面会是什么样子?我已经尝试了以下方面声明,但我可能在这里遗漏了一些东西:

@Around(value = "execution(int java.util.ArrayList.size(..))")
    public void aroundListSize(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("Before the size method is being invoked.");

        joinPoint.proceed();

        System.out.println("After the size method was invoked.");
    }

1 个答案:

答案 0 :(得分:0)

Spring AOP可以在建议的类周围创建代理。与直接修改建议类的字节码的本机AspectJ相比,这有许多限制。其中一个限制(以及许多其他限制)是它只适用于Spring托管bean,而不适用于任何Java对象,就像使用本机AspectJ一样。

如果您的ArrayList对象是Spring托管bean,它将在某种程度上起作用,但您还需要知道基于代理的AOP机制只能通过建议类的外部接口工作,所以它只会通过Spring提供的代理类调用时的工作,而不是通过this引用调用时的工作。因此,从建议的类“this.method()调用anotherMethod(),它将不会通过代理实例,并且不会执行建议代码。