欢迎光临散文网 会员登陆 & 注册

Spring AOP三部曲之调用

2022-05-24 11:43 作者:做架构师不做框架师  | 我要投稿


前言

上篇文章我们讲解了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”,全部都是干货。


Spring AOP三部曲之调用的评论 (共 条)

分享到微博请遵守国家法律