Comments (4)
@jaxlove 我不知道我理解的对不对,我认为你应该是在困惑(在初始化完成之后执行postProcessAfterInitialization
可能会对原有的Bean进行代理,但是在mini-spring中初始化完成之后调用了getSingleton(beanname)
导致触发三级缓存中创建代理的流程,导致原有的代理被覆盖)。其实在spring源码中getSingleton方法还有一个boolean类型的变量boolean allowEarlyReference
来控制最多查询到二级缓存,这样就可以避免触发三级缓存中的提前创建代理。以上是我的看法,希望能够对你有所帮助,可以等待原作者的回答
from mini-spring.
@jaxlove 可以看到作者在 DefaultAdvisorAutoProxyCreator 中增加了一个 earlyProxyReferences 标记,用来判断这个代理对象问题。创建过则不会再次创建。可以看我写的说明,希望对你有帮助:https://github.com/niuxvdong/small-spring/blob/master/small-spring-16/README.md#6%E5%A2%9E%E5%8A%A0-getearlybeanreference-%E5%AE%9E%E7%8E%B0
其实可以通过 debug 来查看一下整个执行流程来帮助理解。
from mini-spring.
@jaxlove @Linweixinyo 如下图,AbstractAutowireCapableBeanFactory#doCreateBean
方法中创建bean后,如果存在代理,则将代理bean放进三级缓存,否则将原始bean放进三级缓存。initializeBean方法入参的bean是原始bean,注意不是代理bean。最后从三级缓存中获取bean,由于是查询缓存,所以不会创建一个新的bean。
from mini-spring.
@jaxlove 建议debug对应单测加深理解
from mini-spring.
Related Issues (20)
- 大佬,再跟着你的代码按文章的顺序开撸,过程中发现中间有几个分支是不是跟文档的顺序乱掉了,还是那几个乱掉的分支在文档中的顺序放错了呀 HOT 1
- 多个bean需要回调销毁方法,在for循环remove HOT 6
- 跟着change.log看代码,bean-definition-and-bean-definition-registry ==> instantiation-strategy ,instantiation-strategy 多了好多东西啊 HOT 4
- 作者大大牛逼,反击抄袭赢得漂亮 HOT 5
- 111 HOT 1
- 恭喜作者大大胜利 HOT 3
- 项目时长 HOT 4
- 看的很爽,感谢大佬开源!~ HOT 1
- resolveBeforeInstantiation()方法返回的代理对象放入singletonObjects里面吗? HOT 2
- 有代理对象解决循环依赖这节内容有些不理解的内容 HOT 5
- 关于ValueAnnotationTest HOT 2
- 使用高版本JDK解决CGLIB冲突方法 HOT 1
- 尊敬的大佬, 在value-annotation 分支中, 测试用例跑不通 HOT 3
- 关于ConfigurableBeanFactory和ConfigurableListableBeanFactory HOT 1
- bean容器中注册BeanDefinition后,使用bean时才会实例化 HOT 1
- 请问为什么不把XmlBeanDefinitionReader的doLoadBeanDefinitions方法里判断bean重名提前一点呢?
- 初始化与销毁方法中,只避免销毁方法执行两次而初始化方法没有相关的判断 HOT 1
- 有无静态页面方便阅读 HOT 1
- 属性占位符替换时,如果当前bean存在String类型的属性但是不用占位符替换,会重复添加PropertyValue
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from mini-spring.