我只是想知道,Spring框架中的Pointcut是如何在内部工作的。它如何知道下一步将执行什么方法(然后在该方法执行之前/之后执行它的工作)?它以某种方式使用反射了吗?即使我将调试点放在Pointcut定义上,调试器也不会命中它。
发布于 2016-05-16 18:28:34
它是通过代理你的方面方法来实现的。对您的方法的调用将替换为对代理方法的调用。代理方法首先执行before-Annotation,然后调用原始方法,然后执行after-Annotation。
proxy方法是syntetic方法,它不会出现在代码中,所以不能添加断点。
发布于 2016-05-16 19:36:10
我所理解的是,这是一个编织的过程。如果您认为切入点只不过是签名,那么它们可以灵活地从包、接口、类或方法甚至通配符中进行选择。
当您的应用程序加载Spring sort创建所有目标的代理时,这就是为什么在我看来,使用通配符不是一个好主意,而是应用于特定的目标。在目标上创建代理的过程实际上是编织的。
调试器不工作的原因是因为类没有被调用,它是由Spring创建的代理。是的,Spring广泛地使用了反射。
我曾经尝试将方面放在JAX-RS类上,但失败了,因为JAX-RS资源没有考虑Spring创建的代理,也没有触发建议。
我还使用了通配符,然后在任何堆栈跟踪中,在任何异常中,我都可以在堆栈跟踪中的某个地方看到Spring代理调用。
附言:与其说是知识,不如说是观察。
https://stackoverflow.com/questions/37250721
复制相似问题