spring|别再说 Spring AOP 默认用的是 JDK 动态代理( 二 )


我截个调用链的堆栈截图 , 可以很直观地看到调用的顺序(从下往上看):



是吧 , 是按照顺序一个一个往后执行 , 然后再一个一个返回 , 就是递归呗 。
然后我再解释下上面的 chain 集合我们看到第一个索引位置的 ExposeInvocationInterceptor。
这个 Interceptor 作为第一个被调用 , 实际上就是将创建的 CglibMethodInvocation 这个对象存入 threadlocal 中 , 方便后面 Interceptor 调用的时候能得到这个对象 , 进行一些调用 。



从名字就能看出 expose:暴露 。
ok , 更多细节还是得自己看源码的 , 应付面试了解到这个程度差不多的 , 上面几个关键点一抛 , 这个题绝对稳了!
Spring AOP 和 AspectJ 有什么区别从上面的题目我们已经知道 , 两者分别是动态代理和静态代理的区别 。
Spring AOP 是动态代理 , AspectJ 是静态代理 。
从一个是运行时织入 , 一个在编译时织入 , 我们稍微一想到就能知道 , 编译时就准备完毕 , 那么在调用时候没有额外的织入开销 , 性能更好些 。
【spring|别再说 Spring AOP 默认用的是 JDK 动态代理】且 AspectJ 提供完整的 AOP 解决方案 , 像 Spring AOP 只支持方法级别的织入 , 而 AspectJ 支持字段、方法、构造函数等等 , 所以它更加强大 , 当然也更加复杂 。