详细分析Spring的AOP源码
前言
本篇文章是SpringAOP的源码学习分享,分为上下两篇,在详细分析Spring的AOP源码上篇中已知SpringAOP的切面类织入业务bean后,会为业务bean生成动态代理对象,这个动态代理对象中持有需要生效的所有通知,叫做通知链。
本篇将对调用AOP动态代理对象时的整个流程进行学习,以探究切面中的类似于前置通知或者后置通知这种通知方法是如何对目标bean的目标方法进行增强的。
注:本文均基于JDK动态代理。正文一. AOP动态代理对象结构分析
在上篇的示例工程中,可以看一下测试程序中从容器获取到的IMyService的bean是什么样子,调试图如下所示。
可以看到获取出来的bean实际为MyService的JDK动态代理对象,InvocationHandler为JdkDynamicAopProxy,JdkDynamicAopProxy中持有ProxyFactory,ProxyFactory中持有目标对象和通知链。二. AOP动态代理对象调用分析
调用动态代理对象的方法时,会调用到InvocationHandler的invoke() 方法,这里InvocationHandler为JdkDynamicAopProxy,所以将JdkDynamicAopProxy的invoke() 方法作为入口开始分析。public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object oldProxy = null; boolean setProxyContext = false; TargetSource targetSource = this.advised.targetSource; Object target = null; try { if (!this.equalsDefined && AopUtils.isEqualsMethod(method)) { // 不会将通知作用在equals()方法,除非目标对象实现的接口中定义了equals()方法 return equals(args[0]); } else if (!this.hashCodeDefined && AopUtils.isHashCodeMethod(method)) { // 不会将通知作用在hashCode()方法,除非目标对象实现的接口中定义了hashCode()方法 return hashCode(); } else if (method.getDeclaringClass() == DecoratingProxy.class) { return AopProxyUtils.ultimateTargetClass(this.advised); } else if (!this.advised.opaque && method.getDeclaringClass().isInterface() && method.getDeclaringClass().isAssignableFrom(Advised.class)) { // 不会将通知作用于Advised接口或者其父接口中定义的方法 return AopUtils.invokeJoinpointUsingReflection(this.advised, method, args); } Object retVal; if (this.advised.exposeProxy) { oldProxy = AopContext.setCurrentProxy(proxy); setProxyContext = true; } // 获取目标对象 target = targetSource.getTarget(); // 获取目标对象的Class对象 Class<?> targetClass = (target != null ? target.getClass() : null); // 将通知链中能够作用于当前方法的通知组装成拦截器链 List
阴阳师6周年情报分析,须佐和SP荒实锤,还有茨林典藏关于阴阳师6周年庆典可能会上线的一系列福利,阿诚其实专门做过一期分析,并在分析文章里明确提到了须佐之男SP荒和典藏皮肤的相关线索。但由于分析是建立在已有的情报线索的基础上,并且时间
传奇手游排行榜前10名手游推荐如何快速玩转传奇最近一直有兄弟私信我冰雪悍刀行怎么玩,今天我就来教大家如何快去玩转传奇,有需求的兄弟一定要坚持看完呀首先进游的福利,背包里的大小什么券领取后直接拉满,全属性加10个点,点击右下角的
穿过连绵不绝有如蚂蚁般大小的大都市,找寻回家的路小眷灵Tinykin是由Splashteam制作,tinyBuild发行的一款3D平台跳跃收集马拉松冒险游戏。整体游玩下来,本作很自然的会让笔者联想到老任家的皮克敏(玩法)和纸片马
赛季末上分英雄干将仅排T2,周瑜能排T1,而能抗能奶的他为唯一T0哈喽,大家好!我是老张。在这个赛季,很多玩家都为了上分十分头疼,尤其是中路的位置,你选择一个比较弱势的英雄前期队友基本上没法玩的,好不容易凭借着发育的优势将自身的经济成形了,但是却
银河战舰都没了?S12四大赛区花钱最多俱乐部现状游戏马蹄铁原创欧洲VIT这支欧洲LEC战队在今年是进行了一次彻底重组,Perkz,Carzzy,Haru等等具有高知名度的选手纷纷加入。季中之后,他们甚至从LPL签下了Bo,不过由
传奇手游新手入门攻略大家好,我是刘大大。我来了,今天给大家分享一下热血传奇的新手攻略,喜欢的朋友可以点点关注。今天我就以一款传奇游戏封月传奇为例子举例,首先在玩家刚进入游戏时,往往因为等级不足,装备不
电竞破局下沉出海造星NFT与线下衍生采写王红霞编辑万天南即使你不玩电竞,也不看比赛,但它还是会离你的生活越来越近,或许是某个线上视频或许在某个线下场馆。比如,上个月刚在杭州内测的腾讯电竞酒店7月底收官的电竞实训综艺战
鸡身上最脏的三个器官,到处都是寄生虫,还有很多人抢着吃如今这个社会,随着生活越来越好,相信大家对食物的质量的要求也越来越高,大家对美食也是爱不释手,在日常我们的生活中都离不开吃一些鸡鸭鱼肉,特别是鸡肉在我们平时吃的食物是最多的一种了。
为何那么多心血管事件,都多发于早晨?做好6点,避免血管失控夏季早晨5点左右就天亮了,在公园或广场能看到很多中老年人晨练,虽然早晨凉爽,晨练有益于机体健康。不过,最让人们扎心的是,清晨是心脑血管疾病高发期,尤其是缺血性脑卒中和急性心梗等,所
食用香椿会致癌?传言称,香椿(芽)中含有大量的亚硝酸盐物质,简单食用就会中毒致癌。其实,硝酸盐和亚硝酸盐广泛存在于自然界的水和土壤中,所以大部分蔬菜都会含有一定量的硝酸盐和亚硝酸盐物质,只是含量不
手脚冰凉是什么原因造成的?手脚冰凉,大家对这种现象并不陌生,尤其是女性和老年人。即使是在炎热的夏天,他们也觉得自己的手和脚没有温度,这种情况一定要引起重视!下面给大家讲一下手脚冰凉到底是什么原因造成的?1情