学习记录 - Spring容器中AOP涉及到的职责链模式

这学期的一门课程的考核有一道题目是要求对自己了解的框架部分源码所使用到的设计模式进行分析,完成后就顺便记录在此啦。有表达不清晰、有问题的地方请指出、赐教,感谢❤

1.Spring中AOP部分源码对应类图

在这里插入图片描述

SpringAOP中的职责链模式是通过一个中间类保存下一个链结点的,和传统的职责链模式将下一个链结点放在当前链结点的方式不同。

2.源码分析

(1)首先说明下环境以及测试类:我写了一个类MathCalculator,其中有一个testFunction方法。
在这里插入图片描述

并且写了一个切面类LogAspects,利用AOP拦截注解的方式写了两个通知方法分别为logStart()和logAfter()。
在这里插入图片描述
最后利用Junit测试testFunction()方法的执行(Debug方式)。
在这里插入图片描述

(2)以下是自己打断点Debug到相关代码片段,将根据图中代码进行自己对于这部分代码的理解。

ReflectiveMethodInvocation类:
在这里插入图片描述

ReflectiveMethodInvocation类中存放通知的对象:
在这里插入图片描述

其中第一个是容器自带的默认通知,后面两个就是自己写的两个通知方法logStart()和logAfter()。

AspectJAfterAdvice类中存放通知的对象:
在这里插入图片描述
(3)调用自己写的testFunction()方法,最后会执行到上一张图的proceed方法,这也是链式调用的开始。ReflectiveMethodInvocation类中的interceptorAndDynamicMethodMatchers对象会存放当前调用方法即testFunction()的通知方法(在这之前已经完成查询和赋值)。
interceptorAndDynamicMethodMatchers对象得到MethodInterceptor对象后调用其invoke(this)方法。this参数为当前ReflectMethodInvocaton类的实例。在invoke方法中会改变interceptorAndDynamicMethodMatchers对象索引获取下一个链结点。

在这里链结构交由了interceptorAndDynamicMethodMatchers对象管理,个人感觉耦合度再一次降低。
链结构可由 interceptorAndDynamicMethodMatchers对象动态改变。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值