Spring IOC循环依赖+AOP代理
2024-02-05 15:51:42 0 举报
详解Spring循环依赖的底层原理,同时详细梳理了Spring IOC容器getBean的调用栈,源码层面概括了每个步骤的基本作用
作者其他创作
大纲/内容
beforeSingletonCreation(beanName);
标记单例A为创建中状态
AbstractBeanFactory.getBean(String name) // getBean(A)
STEP3
条件性地注册为DisposableBean,此类bean在销毁时将调用其销毁方法
STEP1
查询全部三级缓存中是否有指定beanName的单例,此时beanB显然不存在,查询为空
创建单例beanB,封装为wrapper
Object bean = getBean(propertyName) //getBean(A)
查询全部三级缓存中是否有指定beanName的单例,此时beanA显然不存在,查询为空
将proxyB存入一级缓存,清除其他缓存中的同名实例
doGetBean(...)
递归调用getBean,获取beanA的依赖项单例B
//获取到Step1中存入缓存的beanA对应的ObjectFactory对象ObjectFactory<?>span style=\"font-size:inherit;\
标记单例B为创建中状态
return (T) bean
依赖注入,将为beanA注入依赖项proxyB
移除单例A创建中的状态标记
将beanB以lambda创建的ObjectFactory对象的形式存入三级缓存
递归调用getBean,获取beanB的注入依赖项单例A
返回proxyA
Object sharedInstance =getSingleton(beanName)// beanName=A
AbstractBeanFactory.getBean(String name) // getBean(B)
return beanInstance
return exposedObject //返回proxyB
afterSingletonCreation(beanName)
返回proxyB
将proxyA存入一级缓存,清除其他缓存中的同名实例
resolveBeforeInstantiation方法是一个扩展点,给beanPostProcessors一个机会在bean实例化前直接生成代理对象,如果返回不为null表示创建代理成功。则直接跳过后续的标准的实例创建,直接返回该代理对象。如果第三方不主动实现此扩展,span style=\"font-size:inherit;\
Object sharedInstance =getSingleton(beanName) //beanName=B
exposedObject = earlySingletonReference
此处将生成beanA的aop代理proxyA
populateBean执行依赖注入,内部逻辑很复杂,这里只是简写,对于依赖其他bean的场景,只要记住它一定会递归调用getBean来获取依赖bean就是了
STEP2
singletonObject = singletonFactory.getObject()
移除单例B创建中的状态
如果单例为FactoryBean则调用工厂方法生成目标对象,否则原样返回单例
Object bean = getBean(propertyName) //getBean(B)
return (T) bean
创建单例beanA,封装为wrapper
singletonObject = singletonFactory.getObject()
对beanB初始化和后处理,生成并返回proxyB
将lambda创建的beanA对应的ObjectFactory对象存入三级缓存
return exposedObject //返回proxyA,它持有前面已完成依赖注入和初始化的原生beanA的引用
Object sharedInstance =getSingleton(beanName)// beanName=A
0 条评论
下一页