From 01a12b9e74d8d76c7ad651cc563cfd35d3979466 Mon Sep 17 00:00:00 2001 From: AmyliaY <471816751@qq.com> Date: Sun, 10 Nov 2019 10:04:47 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E8=B0=83=E6=95=B4=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E7=BB=93=E6=9E=84=E5=92=8Creadme=202=E3=80=81=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0spring=E6=BA=90=E7=A0=81=E6=95=85=E4=BA=8B=E6=A8=A1?= =?UTF-8?q?=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 +-- .../spring源码故事-面筋哥IoC容器的一天(上).md | 26 +++++++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 docs/Spring/Spring源码故事(瞎编版)/spring源码故事-面筋哥IoC容器的一天(上).md diff --git a/README.md b/README.md index 7aab8fb..6477df7 100644 --- a/README.md +++ b/README.md @@ -7,14 +7,14 @@ [![issues](https://badgen.net/github/open-issues/doocs/source-code-hunter)](https://github.com/doocs/source-code-hunter/issues) [![PRs Welcome](https://badgen.net/badge/PRs/welcome/green)](http://makeapullrequest.com) -阅读互联网公司主流框架源码,目前开放的有 Spring 系列框架、Mybatis 框架、Netty 框架,欢迎各位大佬加入我们,开拓新的领地。本项目主要用于记录框架源码的阅读经验、个人理解及解析,希望能够使阅读源码变成一件更简单的事情,抽空更新中... +阅读互联网公司主流框架源码,目前开放的有 Spring 系列框架、Mybatis 框架、Netty 框架,欢迎各位大佬加入我们,开拓新的领地。本项目主要用于记录框架源码的阅读经验、个人理解及解析,希望能够使阅读源码变成一件更简单有趣,且有价值的事情,抽空更新中... ## spring系列 ### IoC容器 - [BeanDefinition的资源定位过程](/docs/Spring/IoC/一、BeanDefinition的资源定位过程.md) - [将bean解析封装成BeanDefinition](/docs/Spring/IoC/二、将bean解析封装成BeanDefinition.md) - [将BeanDefinition注册进IoC容器](/docs/Spring/IoC/三、将BeanDefinition注册进IoC容器.md) -- [四、依赖注入(DI)](/docs/Spring/IoC/四、依赖注入(DI).md) +- [依赖注入(DI)](/docs/Spring/IoC/四、依赖注入(DI).md) ### AOP ### SpringMVC diff --git a/docs/Spring/Spring源码故事(瞎编版)/spring源码故事-面筋哥IoC容器的一天(上).md b/docs/Spring/Spring源码故事(瞎编版)/spring源码故事-面筋哥IoC容器的一天(上).md new file mode 100644 index 0000000..7056fc3 --- /dev/null +++ b/docs/Spring/Spring源码故事(瞎编版)/spring源码故事-面筋哥IoC容器的一天(上).md @@ -0,0 +1,26 @@ + 引言:庞大的代码量让人心生怠倦,有趣的故事让技术也疯狂。 +大家好,我是IoC容器家族的第17代传人,我们家族世世代代在spring商业街上卖烤面筋,大家都叫我“面筋哥”,另外我爹还给我起了个高大上的英文名字,叫“FileSystemXmlApplicationContext”,但有群臭猴子嫌麻烦,就天天叫我的外号,害得我差点忘了自己的本名。不过无所谓咯,只要生意兴隆,这都是小事。 + +前几天出摊卖烤面筋时,灵感大作,即兴唱了一首“我的烤面筋”,被网友拍下来传到某站上 成了网红,现在我要趁势而上,把自己祖传的烤面筋工艺宣传出去,让我那个臭弟弟“ClassPathXmlApplicationContext”知道,谁才是IoC容器的正统传人! +#### 第一阶段:BeanDefinition资源定位(Reader,beanDefinitionReader,documentReader) +新的一天从new开始,但我却还躺在床上各种伸懒腰,毕竟我现在也是个小老板了,很多杂七杂八的活雇几个小弟干就行咯。我拿起我的iBanana11看了看商业街董事(某程序员)发的“精选优质面筋批发市场地址”,然后深吸一口气refresh(),闭上眼obtainFreshBeanFactory(),气沉丹田refreshBeanFactory(),大喊一声: +“loadBeanDefinitions()!” +我虎背熊腰的小弟“beanDefinitionReader” 破门而入,尖声细语地问道: +“老板有何吩咐 ~ ?” +我起身叮嘱了他几件事后,把自己的联系方式(引用)、面筋批发市场的地址(spring配置文件地址)交给他,就又躺回去盯着天花板上的钻石吊灯继续发呆。 +Reader家有一对兄妹,哥哥beanDefinitionReader虎背熊腰大老粗,却尖声细语;妹妹documentReader心灵手巧,可惜比较宅,我们几乎没怎么见过。兄妹俩相互配合把上午的准备工作做了大半。 +不要看我天天躺着,彗星晒屁股了还眯着眼,ta们兄妹俩在几点几分打个喷嚏我都能算到,毕竟我基因里都写满了“烤面筋工艺完整详细流程”。 +哥哥现在肯定在开着小面包车拿着我给他的地址(locations)到处找面筋等原材料,然后把找到的面筋打包进Document对象,拉回来交给妹妹documentReader进行精心处理,连同Document给她的还有一个“神秘人”的联系方式。 +妹妹会打开Document取出其中最大的几个箱子(<beans>、<import>、<alias>等一级标签),分别进行处理。其中beans箱最为重要,里面放满了夜市的主角,烤面筋的核心材料。 +#### 第二阶段:将bean解析封装成BeanDefinitionHolder(BeanDefinitionParserDelegate) +之后妹妹会拿起我们IoC家族祖传的面筋处理神器BeanDefinitionParserDelegate,从beans箱里面一个一个取出形态各异的面筋bean分别进行加工处理。刚拿出来的面筋bean是不会直接烤了卖的,我们会将bean用神器ParserDelegate进行九九八十一道细致处理,所以我们家烤出来的面筋才会如此劲道美味,世世代代延绵不断。 + 不过处理程序再怎么细致复杂,也不过就是分为两大部分:第一,处理bean的属性信息,如id,class,scope等;第二,处理bean的子元素,主要是标签,而标签又有属性和子元素,且子元素类型更加丰富复杂,可能是<map>,<set>,<list>,<array>等。所以如果你们想学我家的祖传秘方,开个同样的摊子干倒我,也不是这么容易的哦。 + 经过上面的步骤,一个配置文件中的面筋bean就被处理包装成了半成品BeanDefinitionHolder。 +#### 第三阶段:将BeanDefinition注册进IoC容器(BeanDefinitionReaderUtils) +妹妹在用神器BeanDefinitionParserDelegate经过一顿疯狂操作之后,将包装好的半成品BeanDefinitionHolder扔进传输机BeanDefinitionReaderUtils,并且输入哥哥给她的神秘人地址,就继续处理下一个面筋bean咯。 +之后,传输机将BeanDefinitionHolder的包装打开,分别取出beanName(面筋的唯一标识)和BeanDefinition(面筋本筋),传输的目的地是BeanDefinitionRegistry的工作室(这就是我前面给哥哥beanDefinitionReader的地址)。 +这家工作室的BeanDefinitionRegistry其实就是我的影分身之一,因为我的祖先实现了这个接口。影分身Registry检查一下传输过来的beanName(面筋的唯一标识)和BeanDefinition(面筋本筋),如果没什么问题,就把它们用根绳子系在一起扔进我的“王之面筋宝库”,一个ConcurrentHashMap(64),也有人把我的“面筋宝库”称作“IoC容器本器”,我也无可辩驳,谁让他们吃面筋付钱了呢。 +就这样,每一种取出来的面筋都会经过这些处理。等到所有的面筋处理完了,也差不多到了傍晚,每到这时我就会拿起梳子和发油,对着镶满钻石的镜子,梳理整齐与徐峥同款的明星发型,唱着魔性的“我的烤面筋 ~”,骑着小车车,出摊咯 ~ + +面筋等原材料基本上都已经处理完毕,但把这些原材料变成程序员手中的“烤面筋”也是一门复杂而精细的手艺,老铁们记得 watch、star、fork,素质三连一波,下一期我将带领你们走进spring商业街的夜市,一起烤出香喷喷的面筋,成为这条gai上最亮的仔! +