Spring AOP的实现原理 ?

50 篇文章 3 订阅
订阅专栏

Spring AOP的实现原理 ? - 知乎

AOP的实现,最关键的有两步:

  • 得到代理对象
  • 利用递归责任链执行前后置通知及目标方法

IOC容器初始化时,对于涉及AOP操作的目标类,其实Spring返回的是代理对象,而不是目标类的实例。至于Spring是如何创建AOP代理对象的,这里不做讨论,我们只讨论得到代理对象后的链式调用流程。

代理对象proxy其实包含了很多东西,比如:

  • 目标对象
  • 增强器
  • ...

之前我曾经写过一篇动态代理相关的回答: Java 动态代理作用是什么?

大概就是讲了以下两点:

  • 代理对象最终都会间接调用目标对象的同名方法,比如proxy.add() --> target.add()
  • 但代理对象允许在调用add()前后添加一些增强代码,作为功能扩展

即,调用代理对象的方法最终都会“转嫁”成调用目标方法,但是在调用前后会执行一些其他操作,我称这些其他操作为“增强代码”,本质上就是上面提到的 增强器。

代理对象方法 = 拦截器链 +  目标对象方法

比如,JDK动态代理中,我们可以在invoke()方法中得到target并调用target.add(),并在前后加增强代码

AOP返回的代理对象也不例外。

现在假设代理对象proxy调用了某个方法,而这个方法会触发CglibAopProxy.intercept()。先不要理会为啥会触发这个方法,反正人家就是这样设定的。我们来看看intercept()方法:

intercept():

  • 没有拦截器链
    • 直接执行目标方法
  • 有拦截器链
    • 传入拦截器链和目标对象,最终new CglibMethodInvocation(...).proceed()

我们主要考虑有拦截器链的情况。

intercept()说穿了,就干了两件事:

  • 收集拦截器,做成链
  • 把拦截器链和目标对象等传入,执行new CglibMethodInvocation(...).proceed()
new CglibMethodInvocation(proxy, target, method, args, targetClass, chain, methodProxy).proceed();

这里new了一个CglibMethodInvocation对象,你就把它理解成一个大杂烩,反正AOP功能需要的材料都在这里了,包括目标对象、拦截器链啥的。

我们来看看它的proceed()方法干了啥:

简化后的示意图:

也就是说,只要拦截器链没执行完,就不会执行目标方法。即:

  • 先执行全部的拦截器
  • 最后执行 目标方法

我知道你看到这里,会有什么疑问:

既然拦截器都在目标方法前执行,怎么会出现AOP这种汉堡包式的“包夹”调用顺序?

before...
target.add()
afterReturning... ...

别急,接下来就是见证奇迹的时刻,我们看看拦截器的invoke()干了啥。

刚才说过了,拦截器是对增强器的包装。我们增强方法有哪些来着?Before/AfterReturning...等等,所以拦截器肯定也有对应的Before/AfterReturning...

我们先看Before拦截器:

我们发现:

  • 先调用了this.advice.before()。即,反射执行@Before方法。
  • 再调用了mi.proceed()。这个mi,就是我上一个截图传入的this,也就是CglibMethodInvocation对象。

再看After 拦截器:

  • 先调用mi.proceed()
  • 后反射调用@After方法

先别管具体上下文环境以及方法含义,我就问你,单纯看语句调用顺序,Before拦截器和After拦截器有何不同?

答案是:

Before拦截器是先反射调用@Before,再调用 mi.proceed()。
而After拦截器是先调用mi.proceed(),再反射调用@AfterRetruning方法。

其实,只有Before是特殊的,其他拦截器都是先调用proceed(),再反射调用通知方法。

为什么Before拦截器是异类?因为这么多拦截器中,只有Before的通知方法是在目标方法前。所以这个差异,肯定和AOP的汉堡包式的“包夹”调用顺序有莫大关系!Before拦截器这种与众不同的语句顺序,导致了它可以出现在目标对象前执行。

我去,有点晕...

其实这里开始,就进入递归了。递归有时是比较晕的。

为了帮大家理清调用顺序,我画了一张图。不过艺术家的画,有时比较难懂,所以我要先给大家解读一下我的作画风格。比如一个方法如果有两句:

我会画成下面这样:

左边的代表上面的(先执行),右边的代表下面的(后执行)。

好,了解我画图的风格后,上主菜。

AOP递归责任链:

跟着调用栈,可以看到顺序是before---target.add()---after...

流程解读:

  • proxy.add()触发CglibAopProxy.intercept()
  • intercept()
    • 获取所有的拦截器,排好序后做出拦截器链(顺序和AOP执行顺序相反,before反而放链的末尾!)
    • 传入拦截器链和目标对象,new CglibMethodInvocation()并调用proceed()
  • proceed()先执行全部拦截器,最后执行目标方法
  • 目标方法的return是整个递归责任链的精华所在,就像一个弹簧,被压到最大限度,开始return了。所以,原路返回,执行每个拦截器invoke()方法中两个语句的下一句
  • 又由于Before拦截器是先反射执行通知方法后调用proceed(),而其他拦截器是先proceed()后反射,所以形成了“包夹”调用顺序

所以,虽然说拦截器全部执行完毕,才执行目标方法,但是拦截器的invoke()方法其实有两句语句,上一句只是递归调用下一个拦截器,只有等反射执行目标方法后,回来的路上才会真正执行通知方法!

springAop实现原理
ChenJin_2的博客
06-02 2380
springAop实现原理
spring aop实现原理
03-15
NULL 博文链接:https://zhang-yingjie-qq-com.iteye.com/blog/319927
SpringAOP实现原理
Java小技巧
11-09 510
什么是AOP AOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善。OOP引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力。也就是说,OOP允许你定义从上到下的关系,但并不适
Spring AOP 实现机制
最新发布
DHG2012的博客
07-30 1067
使用注解定义Spring AOP允许使用注解来定义pointcuts。常见的注解有@Before@After@Around等,它们内部隐含了一个pointcut。
Spring AOP实现原理
weixin_74268571的博客
08-18 1684
Spring AOP的底层实现原理及详细介绍以及适配器和常用通知的使用
SpringAOP实现原理
m0_57229961的博客
01-27 9369
本学习笔记将尽可能的将AOP的知识讲解的通俗易懂,先从一个典型的问题出发,引入AOP这个概念,介绍AOP的基本概念,再到Spring中的AOP的实现方案,最后进行一个简单的总结归纳。本学习笔记中不考虑cglib、也不会太关注Spring AOP如何使用,而是尽可能的简单的说清楚AOP的工作原理。 笔记中贴出的源代码均是Spring 5.1.7-RELEASE 版本 问题提出 如下代码块,现在需要统计这个方法执行的耗时情况 public void runTask() { doSome
Spring AOP实现原理详解及实例
10-19
为了更深入理解Spring AOP实现原理,下面通过一个简单的实例来演示其应用。 首先,定义一个接口PersonService以及其实现类PersonServiceBean: ```java public interface PersonService { void addPerson(); } ...
深入浅析Springaop实现原理
09-02
AOP(Aspect-Oriented Programming,面向方面编程)是一种编程范式,旨在提供更好的模块化和组织代码的方式,...通过理解Spring AOP实现原理,开发者可以更好地设计和优化应用程序,提升系统架构的灵活性和可扩展性。
Java框架篇?spring AOP 实现原理
12-22
什么是AOP  AOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善。OOP引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共...
Java-由源代码分析Spring AOP实现原理
了解➔熟悉➔掌握➔精通
12-08 452
分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net 什么是AOP AOP(Aspect-OrientedProgramming,面向切面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善。OOP引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力。也就是说,OOP允许
SpringAOP实现原理
Peng_Zachary的博客
04-19 8781
一:SpringAOP的面向切面编程,是面向对象编程的一种补充,用于处理系统中分布的各个模块的横切关注点,比如说事务管理、日志、缓存等。它是使用动态代理实现的,在内存中临时为增强某个方法生成一个AOP对象,这个对象包含目标对象的所有方法,在特定的切入点做了增强处理,并回调原来的方法。 二、核心: SpringAOP的动态代理主要由两种方式实现,JDK动态代理和cglib动态代理。JDK动态代理通过反射来接收代理的类,但是被代理的类必须实现接口,核心是InvocationHandler和Proxy类,cg
Spring aop实现原理
goxingman的博客
12-02 199
Spring aop实现原理 简介   前段时间写的java设计模式–代理模式,最近在看Spring Aop的时候,觉得于代理模式应该有密切的联系,于是决定了解下Spring Aop实现原理。 说起AOP就不得不说下OOP了,OOP中引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。但是,如果我们需要为部分对象引入公共部分的时候,OOP就会引入大量重复的代码。例如...
菜鸟学SSH——Spring容器AOP实现原理——动态代理
纸上得来终觉浅,绝知此事要躬行
07-16 9390
之前写了一篇关于IOC的博客——《Spring容器IOC解析及简单实现》,今天再来聊聊AOP。大家都知道Spring的两大特性是IOC和AOP。 IOC负责将对象动态的注入到容器,从而达到一种需要谁就注入谁,什么时候需要就什么时候注入的效果,可谓是招之则来,挥之则去。想想都觉得爽,如果现实生活中也有这本事那就爽歪歪了,至于有多爽,各位自己脑补吧;而AOP呢,它实现的就是容器的另一大好处了,就是可...
Spring AOP 实现原理
勇往直前的专栏
08-30 546
静态代理 众所周知 Spring 的 AOP 是基于动态代理实现的,谈到动态代理就不得不提下静态代理。实现如下: 假设有一接口 InterfaceA: public interface InterfaceA{ void exec(); } 其中有实现类 RealImplement: public class RealImplement implement Interface...
Spring AOP原理及简单应用
dawuafang
08-14 214
相信只要使用过Spring框架的,大家对于AOP都不陌生,尤其提起它就能立刻随口说出,一般用在日志处理、异常处理、权限验证等方面。但刚开始接触难免会有各种各样的疑惑,今天抽时间,按照之前的理解整理了一份关于Spring AOP的简单教程,希望能够帮助大家尽快的了解它的实现过程及原理。首先来明确几个概念: JointPoint 系统在运行之前,AOP的功能模块需要织入到OOP的功能模块中。要进行这...
Spring AOP实现原理
04-11
Spring AOP 是基于动态代理的实现,通过为目标对象创建一个代理对象来实现对目标对象的增强。在代理对象被调用时,会触发 Spring AOP 提供的拦截器,从而实现对目标方法的前置、后置、异常通知等增强操作。简单来说...
写文章

热门文章

  • nodejs新版本引起的:digital envelope routines::unsupported 127491
  • Maven中央仓库地址大全 62897
  • CMD切换管理员模式的方式!以及设置快捷键,以管理员方式启动CMD[最全] 54163
  • 安装软件提示目前无法访问SmartScreen怎么办? 51228
  • mysql中如何查看表是否被锁 48098

分类专栏

  • python 35篇
  • 大模型 3篇
  • 网站 1篇
  • 软件 7篇
  • 硬件 2篇
  • c语言 39篇
  • java 1篇
  • java基础 109篇
  • jvm 100篇
  • 多线程 70篇
  • 集合类 38篇
  • io 48篇
  • spring 50篇
  • spring boot 67篇
  • spring cloud 28篇
  • 数据库 96篇
  • 缓存 74篇
  • 消息队列 22篇
  • 中间件 9篇
  • 高并发分布式 32篇
  • dubbo 2篇
  • 数据结构 36篇
  • 算法 45篇
  • 设计模式 29篇
  • 容器化 19篇
  • 测试 14篇
  • 前端 3篇
  • 系统 94篇
  • 开发工具 50篇
  • idea 29篇
  • pycharm 2篇
  • 虚拟机 4篇
  • 学习资料 3篇
  • 学习记录 10篇

最新评论

  • 通义千问模型使用text-generation-webui搭建webui页面

    计算机小鹏: 我的cuda是11.8版本怎么办

  • G1垃圾收集器详解

    yygr: 我搜了一下,是说G1初始的比例是1:2,过程中的比例是动态变化的,看的这篇文章,可以再多看看其它资料: https://www.sohu.com/a/460663353_185201

  • 电脑端微信无法打开腾讯文档

    YuKuiKuiZi: 最终解决方法有效,感谢

  • G1垃圾收集器详解

    下水道里的老鼠。: 想请问博主一个问题,就是之前说的新生代和老年代的大小是1:2,在G1收集器这里还是这样吗

  • 新版 Chrome 的下载通知切回以前的底部通知方式

    XXSec.: 为什么我的chorme浏览器 每次打开这个下载图标都从别的地方弹出来啊 每次打开浏览器的时候都是 烦死了

最新文章

  • 访问者模式与双分派
  • Spring之@Transactional源码解析
  • windows怎么通过pid查找java.exe进程的具体进程信息
2024
08月 6篇
07月 15篇
06月 11篇
04月 11篇
03月 10篇
02月 6篇
01月 3篇
2023年180篇
2022年822篇
2021年27篇
2019年17篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

深圳SEO优化公司网站优化排名推广优选兴田德润企业电商网站优化马尾区企业网站优化成都齐全的网站优化湛江网站权重优化优化网站排名就选火13星网站优化文档自动优化网站软件没有新津区网站seo优化排名温州平阳县最火百度网站优化河源首页网站关键词优化排名天津企业网站排名优化方案安徽网站优化多少钱做好网站的优化桂林正规网站排名优化苏州企业网站关键词优化吐鲁番网站优化平台上海做网站优化哪家好溧水区个人网站优化北京SEO网站优化公司凌海优化网站排名曹妃甸网站优化推荐武汉省心的销售行业网站优化郴州网站优化公司有哪些福建省给网站优化具体做什么的如何优化网站打开速度坪地全国网站优化汕头网站优化推广业务吉利区网站优化排名长沙网站优化推广分析歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化