阿里巴巴|Spring源码之——有BeanDefinition才有Bean( 二 )


?setAllowCircularReferences 是否允许Bean之间的循环引用 , 为true时(默认)会自动解决循环依赖
?setAllowRawInjectionDespiteWrapping 是否允许原始Bean(没有切面和装饰)的注入 , 默认FALSE , 不那么常用 , 也不鼓励使用
?setAllowEagerClassLoading 是否允许Bean的Class提前加载 , 及时被标识为lazy-init , 默认true
加载BeanDefinition
自此 , 我们就已经得到了一个BeanFactory对象 , 这之后 , 我们将使用BeanFactory实例完成一系列的后续工作 。 在refreshBeanFactory中 , 则有非常重要的一步——loadBeanDefinitions(beanFactory) , 这里面的源码真的是很庞大 , 我们还是挑重点进行讲解 。


继续看loadBeanDefinitions(beanDefinitionReader)的核心逻辑
下面就进入了XmlBeanDefinitionReader的加载逻辑中
加载多个资源 , 便有加载单个资源接口 , 直接看
转化成String location转化成 Resource之后继续下钻 -loadBeanDefinitions(resources)并且会继续遍历后执行loadBeanDefinitions(new EncodedResource(resource));

EncodedResource加上了编码和字符集信息 , 继续下钻至doLoadBeanDefinitions(inputSource encodedResource.getResource())
这里加上2个标题 , 之前都跳过也没有关系 , 核心的就是这里的逻辑:将配置信息Resource读取成Document对象中 , 并根据该Document对象将资源注册到Bean工厂中
?doLoadDocument(inputSource resource)
?registerBeanDefinitions(doc resource)

继续看 , 又是将处理逻辑委托给BeanDefinitionDocumentReader实例的方法 registerBeanDefinitions , 搞不清这是装饰器模式 , 还是适配器模式 , 还是代理模式 。。。先看DefaultBeanDefinitionDocumentReader的实现吧

protectedvoidparseBeanDefinitions(Elementroot BeanDefinitionParserDelegate delegate) {//
if(delegate.isDefaultNamespace(root)) {
NodeListnl = root.getChildNodes();
for(inti =0; i < nl.getLength(); i++) {



进去看下

我们在上面铁锅BeanFactory的类图 , 实现了BeanDefinitionRegistry和AliasRegistry , 所以传进来的就是BeanFactory对象了这样兜一大圈子有啥好处呢?这样理解起来也贼复杂了
这就是面向接口编程了 , 每一层只负责自己职责内的逻辑 , 其他的逻辑我只调用接口引用的方法就可以了 , 你给我什么实现 , 就会调用谁的实现 。 扩展性就好了嘛
因为我们知道不同的环境下 , 很多的变话 , 比如:
2.配置文件的读取逻辑不同 , 所以要用不同的Reader
3.BeanFactory的具体实现类也可能有所不同

回到BeanFactory再看 , BeanDefinition是怎么被加载的 , 进入
这里的逻辑就蛮简单的 , BeanDefinition列表都已经拿到了 , 就注册上去好了(忽略的和没有提到的代码无非就是检查重复、判断是否已经有同名的单例Bean存在了 , 都销毁、刷新或重置下)
至此 , 就完成了BeanFactory的实例化 , 基础设置工作和BeanDefinition加载工作 , 因为笔者使用的是XML的配置文件 , 在最终的BeanDefinition加载前经过XmlBeanDefinitionReader中的BeanDefinitionDocumentReader处理 , 并交由BeanDefinitionParserDelegate完成配置资源加载成Document并解析成BeanDefinition , 并由BeanDefinitionReaderUtils调用BeanDefinitionRegistry实例(也就是BeanFactory实例)完成BeanDefinition的注册 。
https://blog.csdn.net/mytream/article/details/124892899
也可以前往(请给我一根烟的时间https://blog.csdn.net/mytream)查看更多个人心得和分享 , 和笔者一起互相讨论