我只是想知道,Spring框架中的Pointcut
如何在内部工作。它如何知道接下来要执行的方法(然后它在方法执行之前/之后完成它的工作)?它以某种方式使用反射吗?
即使我将调试点放在Pointcut
定义上,调试器也不会命中它。
答案 0 :(得分:5)
通过代理您的预期方法来实现。对方法的调用将替换为对代理方法的调用。代理方法首先执行before-Annotations,然后调用原始方法,然后执行after-Annotations。
代理方法是syntetic,它在代码中没有出现,因此您无法添加断点。
答案 1 :(得分:0)
我理解的是,这是一个编织过程。如果您认为您的切入点只是签名,那么它们可以灵活地从包,接口,类或方法甚至通配符中进行选择。
当您的应用程序加载Spring时,会创建所有目标的代理,这就是为什么我认为使用通配符并不适用于特定目标。在目标上创建代理的过程实际上就是编织。
调试器不起作用的原因是因为没有调用类,它是Spring创建的代理。是的,Spring广泛使用反射。
我曾经尝试将Aspects放在JAX-RS类上并且失败了,因为Spring创建的代理没有被JAX-RS资源考虑在内,并且建议没有被解雇。
我也使用了外卡,然后在任何异常的任何堆栈跟踪中,我可以在堆栈跟踪中的某处看到Spring代理调用。
P.S更多的是观察而不是知识。