Spring AOP proxy生成流程源码解读

本文通过研读Spring启动时的源码来探索Spring是如何支持AOP功能的。
Spring AOP proxy的生成流程大致如下:
对于普通的代理bean的生成,是在调用构造出原始bean(即被代理bean)后,populate了bean之后,在对bean进行initialize时(就是BeanPostProcessor和InitializingBean的逻辑执行的地方),会调用AbstractAutoProxyCreator(实现了BeanPostProcessor)的postProcessAfterInitialization方法,在方法里最终会调用生成代理对象的逻辑,最终会返回代理对象给BeanFactory,最后BeanFactory再把该代理对象放入一级缓存里。

源码研读:
先在AbstractBeanFactory的doGetBean方法里打上断点,并给断点加上condition beanName.equals(“beProxied”),这里的beProxied是我的被代理的bean的beanName
在这里插入图片描述

然后走到执行getSingleton方法这里,这个方法最终会执行这个给它传入的ObjectFactory的getObject方法,也就是最终会执行下面的return createBean(beanName, mbd, args),我们直接跳进去:
在这里插入图片描述

在createBean方法里调用doCreateBean方法,doCreateBean里会真正执行生成bean的逻辑:
在这里插入图片描述

进入doCreateBean里:
在这里插入图片描述

进入initializeBean方法里,走到applyBeanPostProcessorsAfterInitialization方法里,该方法就是为该bean执行每个BeanPostProcessor的postProcessAfterInitialization方法的。AOP proxy生成的逻辑就是在BeanPostProcessor的实现类AbstractAutoProxyCreator的postProcessAfterInitialization方法里的(非循环依赖的场景):
在这里插入图片描述

进入到applyBeanPostProcessorsAfterInitialization方法里,加上断点,并给断点加上Condition以找到AbstractAutoProxyCreator,最终我们发现该processor是AnnotationAwareAspectJAutoProxyCreator,它是AbstractAutoProxyCreator的子孙类
在这里插入图片描述

进入AbstractAutoProxyCreator的postProcessAfterInitialization方法里,生成aop proxy的逻辑在wrapIfNecessary方法里:
在这里插入图片描述

进入到wrapIfNecessary方法里,在该方法里最终会调用createProxy方法来生成proxy对象。上面的getAdvicesAndAdvisorsForBean方法可以用来控制是否生成proxy:
在这里插入图片描述

可以看到,在createProxy方法里最终用ProxyFactory来生成aop proxy的
在这里插入图片描述

在生成了proxy后,该proxy最终会返回给BeanFactory,BeanFactory最终会把该proxy存入IOC容器中:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值