Cglib版在代理对象生成时,由方法和AOP上下文来决定具体使用哪个Callback,在运行时直接通过Callback进行方法调用。下面我们介绍两种类型的Callback:DynamicAdvisedInterceptor和FixedChainStaticTargetInterceptor,先从DynamicAdvisedInterceptor开始。

一.DynamicAdvisedInterceptor

提示:
    DynamicAdvisedInterceptor是常用的Callback。

使用DynamicAdvisedInterceptor时序图如下:

查看大图

动态代理对象运行分析-Cglib版-DynamicAdvisedInterceptor时序图

方便大家查看,把在前篇中的ReflectiveMethodInvocation时序图拿过来:

查看大图

ReflectiveMethodInvocation时序图

下面这个图是ReflectiveMethodInvocation运行时形象表示。其中红点表示目标方法,执行时从圆外沿半径往圆心执行,每个圈表示一个织入逻辑,目标方法执行完后,原路返回。

ReflectiveMethodInvocation示意图

ReflectiveMethodInvocation部分源代码截图:

查看大图

Spring设计亮点-ReflectiveMethodInvocation源代码

二.FixedChainStaticTargetInterceptor

使用FixedChainStaticTargetInterceptor时序图如下:

查看大图

动态代理对象运行分析-Cglib版-FixedChainStaticTargetInterceptor时序图

FixedChainStaticTargetInterceptor源代码如下:

查看大图

FixedChainStaticTargetInterceptor源代码

FixedChainStaticTargetInterceptor相比DynamicAdvisedInterceptor节省了查找和确认织入逻辑调用链的环节,相当于Cglib帮我们做的编译优化。到现在大家已经对运行时Cglib版和Jdk版动态代理运行有了清楚的认识,是不是还缺少点什么—应用实战,对,别急,待我们把AOP介绍完,在访问数据部分将事务和缓存的时候看看具体的使用。接下来我们看看Spring AOP对AspectJ是如何支持的,先从Spring-AOP基础设施介绍-AspectJ配套设施开始。

快速导航: