DerekYRC / mini-spring

mini-spring是简化版的spring框架,能帮助你快速熟悉spring源码和掌握spring的核心原理。抽取了spring的核心逻辑,代码极度简化,保留spring的核心功能,如IoC和AOP、资源加载器、事件监听器、类型转换、容器扩展点、bean生命周期和作用域、应用上下文等核心功能。

Home Page:https://github.com/DerekYRC/mini-spring

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

resolveBeforeInstantiation()方法返回的代理对象放入singletonObjects里面吗?

ccl125 opened this issue · comments

commented

看到动态代理融入bean生命周期这节,有些疑问:
1、 这节resolveBeforeInstantiation()方法生成的代理对象没有放在单例池里面,导致refresh()方法默认提前实例化单例bean的时候会执行一遍创建对象的过程,接着测试方法里面再去调用getBean()方法又会重写再执行一遍创建对象的过程,这里我认为代理对象默认也是单例的,好像应该在创建完成之后放在singletonObjects里面更合适一点。然后我看到下面的bug fix:没有为代理bean设置属性(discovered and fixed by @kerwin89)这节的内容,修复了动态代理融入bean生命周期这节中没有为代理对象设置属性的bug,通过这节中的方式修饰后,生成的代理对象就会走正常的创建完默认单例的对象存入singletonObjects中的流程,也就是在测试的时候,加载完xml文件,调用getBean()方法的时候就直接从singletonObjects中取出来,而不需要重新再执行一遍创建对象的过程了。疑问的点在于我又去重新看了下spring的源码,发现spring中通过resolveBeforeInstantiation(beanName, mbdToUse)方法返回代理对象后就直接返回了,spring中也没有把这个代理对象存储。那这个生成的代理对象到底应该存储起来吗?这里可能会涉及到后面循环依赖的内容,不知道是不是我看到那里就不会纠结这里的内容了
2、bug fix:没有为代理bean设置属性(discovered and fixed by @kerwin89)这节内容修改后,生成代理对象的地方应该就是我下图中划的地方吧。
Snipaste_2023-04-03_23-55-25

@ccl125

1、我也很疑惑resolveBeforeInstantiation方法的作用,在spring中没有具体的应用。看spring源码的对于该方法的注释,这个方法是在bean实例化前提供一个短路的机会,当返回bean不为null时,不继续走spring的bean实例化流程。

image

2、对的。有空我更新下流程图。

谢谢你的支持!

commented

谢谢作者大大的解答。
网上搜了下资料,这个resolveBeforeInstantiation()方法相当于spring留下的一个扩展接口,可以通过继承子类的方式,返回bean,而不走spring正常createBean的方式。
https://juejin.cn/post/7068511224471748645