栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【Spring 注解驱动】学习笔记 07 - Spring AOP(七)AOP原理之获取拦截器链【MethodInterceptor】

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【Spring 注解驱动】学习笔记 07 - Spring AOP(七)AOP原理之获取拦截器链【MethodInterceptor】

文章目录
    • 参考资料
    • 源码分析
      • 1、拦截目标方法的执行
        • 1.1、获取拦截器链
            • `DefaultAdvisorChainFactory#getInterceptorsAndDynamicInterceptionAdvice()`
            • `DefaultAdvisorAdapterRegistry#getInterceptors()`
        • 1.2、如果没有拦截器链
        • 1.3、如果有拦截器链

参考资料
  • 视频 - AOP原理-获取拦截器链-MethodInterceptor

本篇文章主要是分析目标方法的执行过程。

源码分析


增强器里面包含了之前文章中分析的四个自定义通知方法。

1、拦截目标方法的执行

DynamicAdvisedInterceptor#intercept()

1.1、获取拦截器链

根据 ProxyFactory 对象获取将要执行的目标方法拦截器链 getInterceptorsAndDynamicInterceptionAdvice() 。

AdvisedSupport#getInterceptorsAndDynamicInterceptionAdvice()

DefaultAdvisorChainFactory#getInterceptorsAndDynamicInterceptionAdvice()


getInterceptorsAndDynamicInterceptionAdvice() 方法将所有拦截器封装在 List interceptorList 中。

该集合的长度是5,包含一个默认的 ExposeInvocationInterceptor 和 4个自定义增强器。

遍历所有的增强器,将其转为 Interceptor (MethodInterceptor 继承了 Interceptor)。

DefaultAdvisorAdapterRegistry#getInterceptors()

  • 如果是 MethodInterceptor,直接加入到集合中。
    interceptors.add((MethodInterceptor) advice);

  • 如果不是,使用 AdvisorAdapter 将增强器转为 MethodInterceptor。
    interceptors.add(adapter.getInterceptor(advisor));

  • 转换完成返回 MethodInterceptor 数组。
    return interceptors.toArray(new MethodInterceptor[interceptors.size()]);

综上,所谓拦截器链,实际上是每一个通知方法被包装成了方法拦截器 MethodInterceptor 再放到集合中。

1.2、如果没有拦截器链

如果没有拦截器链,直接执行目标方法。

1.3、如果有拦截器链

如果有拦截器链,把需要执行的目标对象,目标方法拦截器链等信息传入创建一个 CglibMethodInvocation 对象,并调用 proceed() 方法。

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号