2016-05-16 38 views
4

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

+0

这只是基于AspectJ的编织(加载时间或编译时间)? –

+0

@TeemuIlmonen不,通常是Spring Auto Proxies。您可以启用AspectJ,但通常自动代理是默认选择。 –

+2

Spring将所有豆子放入单独的袋子(代理)并观察这些袋子之间的相互作用。 Spring不会考虑包包本身的相互作用。只有行李(代理)之间的呼叫被拦截,这是执行前后条款的时间。 – Palcente

回答

5

它通过代理您的预期方法来实现。对您的方法的调用被替换为对代理方法的调用。代理方法首先执行注解之前,然后调用您的原始方法,然后执行注解之后。

代理方法是syntetic,它没有出现在你的代码中,所以你不能添加断点。

0

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

当你的应用程序加载春天排序产生的所有目标的代理,这就是为什么在我看来,它不是使用通配符,而不是适用于特定目标的好主意。在目标上创建代理的过程实际上是编织。

调试器不工作的原因是因为该类未被调用,而是由Spring创建的代理。是的,春天广泛使用反思。

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

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

P.S它比知识更多的是观察。