我正在使用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.");
}
答案 0 :(得分:0)
Spring AOP可以在建议的类周围创建代理。与直接修改建议类的字节码的本机AspectJ相比,这有许多限制。其中一个限制(以及许多其他限制)是它只适用于Spring托管bean,而不适用于任何Java对象,就像使用本机AspectJ一样。
如果您的ArrayList
对象是Spring托管bean,它将在某种程度上起作用,但您还需要知道基于代理的AOP机制只能通过建议类的外部接口工作,所以它只会通过Spring提供的代理类调用时的工作,而不是通过this
引用调用时的工作。因此,从建议的类“this.method()
调用anotherMethod()
,它将不会通过代理实例,并且不会执行建议代码。