Spring AOP三部曲之调用

前言
上篇文章我们讲解了Spring AOP是如何创建代理对象的,在这篇文章我们继续讲解AOP是如何调用的。

这是从网上找的一个简单demo,大家可以对照着去理解。
注意:本文是以5.2.3版本为讲解。
步骤一:创建代理
在昨天我们讲解了通过createAopProxy()方法里我们根据不同策略是通过JDK和CGLIB的代理,在这里我们以JDK创建代理对象为讲解。

步骤二:创建JDK动态代理
大致业务如下:
completeProxiedInterfaces:获取代理类要实现的接口,包括:SpringProxy类、Advised类、DecoratingProxy类
findDefinedEqualsAndHashCodeMethods:检查上面得到的接口有没有equals方法或hashCode方法
newProxyInstance:创建代理对象
了解过动态代理的人应该都知道,生成的代理对象的调用方法是invoke()方法,所以我们通过invoke()方法去分析是如何调用的。

步骤三:处理代理实例上的方法调用并返回结果
InvocationHandler.invoke 的实现。大致业务如下:
equals:被代理对象未实现equals方法,使用默认equals方法
hashCode:被代理对象未实现hashCode方法,使用默认hashCode方法
ultimateTargetClass:获取被代理对象的最终目标类
invokeJoinpointUsingReflectioon:Advised接口或者其父接口中定义的方法,直接反射调用,不应用通知
getInterceptorsAndDynamicInterceptionAdvice:获取此方法的拦截链
如果拦截链为空,直接反射调用JoinPoint
如果拦截链非空,创建MethodInvocation(方法调用),应用通知,并执行JointPoint


步骤四:获取此方法的拦截器链
通过该方法我们可以看到,拦截器链是从AdvisorChainFactory.getInterceptorsAndDynamicInterceptionAdvice()方法获取到,并放入到缓存中,我们继续往下看。

步骤五:获取config中的advisor列表
大致业务如下:
遍历处理这些advisor
如果是PointAdvisor,则判断此Advisor能否应用到目标类方法上
如果是IntorductionAdvisor,则判断此Advisor能否应用到目标类targetClass上
将满足的放入到interceptor集合上

步骤六:触发拦截器链的执行
大致业务如下:
如果Interceptor都执行完了,则执行joinPoint
如果动态匹配运行时参数满足匹配条件,执行相应方法,不满足略过当前Interceptor,调用下一个Interceptor
否则执行当前Interceptor的目标方法

步骤七:反射调用目标方法
如果Interceptor都执行完了,则反射调用当前Interceptor的目标方法
时序图

写在最后
好兄弟可以点赞并关注我的公众号“javaAnswer”,全部都是干货。
