详细分析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
庾澄庆与47岁老婆腻歪依偎!女方戴大金链好贵气,一颦一笑似少女饿了吗?戳右边关注我们,每天给您送上最新出炉的娱乐硬核大餐!11月19日,有台媒曝光歌手庾澄庆与老婆张嘉欣同框的照片,引发外界热议。照片中,61岁的庾澄庆穿着白色T恤,戴着红色棒球
将军丈夫膝下无子,妻子劝丈夫再娶,后来生下4个科学家孙立人的一生育有两子两女。这四个孩子的成就是显著的。后来都成为了有名的科学家。不过,孙立人的这四个孩子,并不是他的妻子张晶英所生。原来,张晶英无法生育,为了能让孙家有后,张晶英这才
空有凌云志却不识人,徽宗活该下场凄惨!(宋徽宗时代第2卷150)第二部时代拼图人人都想证明自己,帝王也不例外。所不同的是,普通人证明自己,以个人的人生为代价帝王证明自己,以整个王朝亿万生灵的人生为代价。这看上去很不公平,可这就是人类社会的本质。
小人得志莫猖狂谈古论今不荒唐,小人得志莫猖狂。善恶到头终有报,人间正道是沧桑。有君子的地方就有小人,有小人的地方就有江湖,君子是正义的化身,小人是邪恶的代表,正邪之争,善恶之别,虽说正义最终战胜
铁血贵州省长军阀出身的周西城你眼中的军阀是什么形象呢?是那种烧杀淫掠,无恶不作的,还是那种风度翩翩的影视剧中的形象。今天我们来说一下军阀出身的贵州省长周西城。年轻帅气的周西成周西城一九一一年参军,一九二六年被
互联网增长策略的底层逻辑有一个奇怪的现象。互联网公司极其重视战略定位,但很少使用定位理论。我们从来没有听到中国互联网前10名头部公司创始人,公开使用定位理论来介绍自己的公司。我是谁?消费理由?信任状?那互
密县供销社为何建社不到一年即开始整顿1951年下半年到1952年上半年,密县供销社进入了快速发展期,然而一年以后的1952年7月即进行了整顿,其中的原因是什么呢?1951年夏季,河南省合作社召开第一次社员代表会议,作
有把iPhone12mini当主力机的吗?12mini一出就买了,一直用到现在快两年了,从4S到5S,iphone6到12mini,中间也使用过华为mate10,mate20,但还是喜欢用小屏手机,钟爱小屏手机的完美掌控感
补肾固原的长寿穴涌泉(井穴)别名地冲穴义体内肾经的经水由此外涌而出。名解1)涌泉。涌,外涌而出也。泉,泉水也。涌泉名意指体内肾经的经水由此外涌而出体表。本穴为肾经经脉的第一穴,它联通肾经的体内体表
有高血压的人,需要控制心率吗,控制在多少比较好呢?有位患高血压的朋友问华子,他的心率每分钟80多次,是不是太快了,要不要控制一下?有什么方法可以控制,控制到什么程度比较好呢?华子说,有高血压的人应当关注自己的心率,如果心率超过每分
字节跳动上线番茄畅听音乐版,听歌可赚金币提现记者肖芳据界面新闻了解,字节跳动新上线一款音乐App番茄畅听音乐版,该App为番茄畅听的衍生版,主要聚焦音乐流媒体服务,而番茄畅听集合了音乐小说广播相声评书等多种流媒体服务。在产品