You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
source-code-hunter/docs/Spring/Spring源码故事(瞎编版)/面筋哥IoC容器的一天(上).md

27 lines
5.3 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

引言:庞大的代码量让人心生怠倦,有趣的故事让技术也疯狂。
大家好我是IoC容器家族的第17代传人我们家族世世代代在spring商业街上卖烤面筋大家都叫我“面筋哥”另外我爹还给我起了个高大上的英文名字叫“FileSystemXmlApplicationContext”但有群臭猴子嫌麻烦就天天叫我的外号害得我差点忘了自己的本名。不过无所谓咯只要生意兴隆这都是小事。
前几天出摊卖烤面筋时,灵感大作,即兴唱了一首“我的烤面筋”,被网友拍下来传到某站上 成了网红现在我要趁势而上把自己祖传的烤面筋工艺宣传出去让我那个臭弟弟“ClassPathXmlApplicationContext”知道谁才是IoC容器的正统传人
#### 第一阶段BeanDefinition资源定位ReaderbeanDefinitionReaderdocumentReader
新的一天从new开始但我却还躺在床上各种伸懒腰毕竟我现在也是个小老板了很多杂七杂八的活雇几个小弟干就行咯。我拿起我的iBanana11看了看商业街董事某程序员发的“精选优质面筋批发市场地址”然后深吸一口气refresh()闭上眼obtainFreshBeanFactory()气沉丹田refreshBeanFactory(),大喊一声:
“loadBeanDefinitions()!”
我虎背熊腰的小弟“beanDefinitionReader” 破门而入,尖声细语地问道:
“老板有何吩咐 ~ ?”
我起身叮嘱了他几件事后把自己的联系方式引用、面筋批发市场的地址spring配置文件地址交给他就又躺回去盯着天花板上的钻石吊灯继续发呆。
Reader家有一对兄妹哥哥beanDefinitionReader虎背熊腰大老粗却尖声细语妹妹documentReader心灵手巧可惜比较宅我们几乎没怎么见过。兄妹俩相互配合把上午的准备工作做了大半。
不要看我天天躺着彗星晒屁股了还眯着眼ta们兄妹俩在几点几分打个喷嚏我都能算到毕竟我基因里都写满了“烤面筋工艺完整详细流程”。
哥哥现在肯定在开着小面包车拿着我给他的地址locations到处找面筋等原材料然后把找到的面筋打包进Document对象拉回来交给妹妹documentReader进行精心处理连同Document给她的还有一个“神秘人”的联系方式。
妹妹会打开Document取出其中最大的几个箱子<beans>、<import>、<alias>等一级标签分别进行处理。其中beans箱最为重要里面放满了夜市的主角烤面筋的核心材料。
#### 第二阶段将bean解析封装成BeanDefinitionHolderBeanDefinitionParserDelegate
之后妹妹会拿起我们IoC家族祖传的面筋处理神器BeanDefinitionParserDelegate从beans箱里面一个一个取出形态各异的面筋bean分别进行加工处理。刚拿出来的面筋bean是不会直接烤了卖的我们会将bean用神器ParserDelegate进行九九八十一道细致处理所以我们家烤出来的面筋才会如此劲道美味世世代代延绵不断。
不过处理程序再怎么细致复杂也不过就是分为两大部分第一处理bean的属性信息如idclassscope等第二处理bean的子元素主要是<property>标签,而<property>标签又有属性和子元素,且子元素类型更加丰富复杂,可能是&lt;map>&lt;set>&lt;list>&lt;array>等。所以如果你们想学我家的祖传秘方,开个同样的摊子干倒我,也不是这么容易的哦。
经过上面的步骤一个配置文件中的面筋bean就被处理包装成了半成品BeanDefinitionHolder。
#### 第三阶段将BeanDefinition注册进IoC容器BeanDefinitionReaderUtils
妹妹在用神器BeanDefinitionParserDelegate经过一顿疯狂操作之后将包装好的半成品BeanDefinitionHolder扔进传输机BeanDefinitionReaderUtils并且输入哥哥给她的神秘人地址就继续处理下一个面筋bean咯。
之后传输机将BeanDefinitionHolder的包装打开分别取出beanName面筋的唯一标识和BeanDefinition面筋本筋传输的目的地是BeanDefinitionRegistry的工作室这就是我前面给哥哥beanDefinitionReader的地址
这家工作室的BeanDefinitionRegistry其实就是我的影分身之一因为我的祖先实现了这个接口。影分身Registry检查一下传输过来的beanName面筋的唯一标识和BeanDefinition面筋本筋如果没什么问题就把它们用根绳子系在一起扔进我的“王之面筋宝库”一个ConcurrentHashMap<String, BeanDefinition>(64)也有人把我的“面筋宝库”称作“IoC容器本器”我也无可辩驳谁让他们吃面筋付钱了呢。
就这样,每一种取出来的面筋都会经过这些处理。等到所有的面筋处理完了,也差不多到了傍晚,每到这时我就会拿起梳子和发油,对着镶满钻石的镜子,梳理整齐与徐峥同款的明星发型,唱着魔性的“我的烤面筋 ~”,骑着小车车,出摊咯 ~
面筋等原材料基本上都已经处理完毕,但把这些原材料变成程序员手中的“烤面筋”也是一门复杂而精细的手艺,老铁们记得 watch、star、fork素质三连一波下一期我将带领你们走进spring商业街的夜市一起烤出香喷喷的面筋成为这条gai上最亮的仔