Spring框架中的Pointcut如何在内部工作

时间:2016-05-16 09:31:54

标签: java spring reflection aop spring-aop

我只是想知道,Spring框架中的Pointcut如何在内部工作。它如何知道接下来要执行的方法(然后它在方法执行之前/之后完成它的工作)?它以某种方式使用反射吗? 即使我将调试点放在Pointcut定义上,调试器也不会命中它。

2 个答案:

答案 0 :(得分:5)

通过代理您的预期方法来实现。对方法的调用将替换为对代理方法的调用。代理方法首先执行before-Annotations,然后调用原始方法,然后执行after-Annotations。

代理方法是syntetic,它在代码中没有出现,因此您无法添加断点。

答案 1 :(得分:0)

我理解的是,这是一个编织过程。如果您认为您的切入点只是签名,那么它们可以灵活地从包,接口,类或方法甚至通配符中进行选择。

当您的应用程序加载Spring时,会创建所有目标的代理,这就是为什么我认为使用通配符并不适用于特定目标。在目标上创建代理的过程实际上就是编织。

调试器不起作用的原因是因为没有调用类,它是Spring创建的代理。是的,Spring广泛使用反射。

我曾经尝试将Aspects放在JAX-RS类上并且失败了,因为Spring创建的代理没有被JAX-RS资源考虑在内,并且建议没有被解雇。

我也使用了外卡,然后在任何异常的任何堆栈跟踪中,我可以在堆栈跟踪中的某处看到Spring代理调用。

P.S更多的是观察而不是知识。