引言:庞大的代码量让人心生怠倦,有趣的故事让技术也疯狂。

大家好,我是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<String, BeanDefinition>(64),也有人把我的“面筋宝库”称作“IoC容器本器”,我也无可辩驳,谁让他们吃面筋付钱了呢。
就这样,每一种取出来的面筋都会经过这些处理。等到所有的面筋处理完了,也差不多到了傍晚,每到这时我就会拿起梳子和发油,对着镶满钻石的镜子,梳理整齐与徐峥同款的明星发型,唱着魔性的“我的烤面筋 ~”,骑着小车车,出摊咯 ~
面筋等原材料基本上都已经处理完毕,但把这些原材料变成程序员手中的“烤面筋”也是一门复杂而精细的手艺,老铁们记得 watch、star、fork,素质三连一波,下一期我将带领你们走进spring商业街的夜市,一起烤出香喷喷的面筋,成为这条gai上最亮的仔!

spring源码故事-面筋哥IoC容器的一天(上)相关推荐

  1. 剖析Spring源码:加载IOC容器

    本文接上一篇文章 阅读Spring源码:IOC控制反转前的处理,继续进行下面的分析 首先贴出 Spring bean容器的刷新的核心 11个步骤进行祭拜(一定要让我学会了-阿门) // 完成IoC容器 ...

  2. spring源码阅读(3)-- 容器启动之BeanFactoryPostProcessor

    接着上文<spring源码阅读(2)-- 容器启动之加载BeanDefinition>,当spring加载完所有BeanDefinition时,并不会马上去创建bean,而是先配置bean ...

  3. Spring源码解读(一)——容器是如何初始化的

    为什么要读源码 Spring是一群优秀的框架组成的社区.现在已经非常丰富了.当我们享受着Spring带来的便利同时,有时也想一探究竟. 人人都说Spring好,难免有人趋之若鹜,如果让你说出个究竟,你 ...

  4. [spring源码学习]三、IOC源码——自定义配置文件读取

    一.环境准备 在文件读取的时候,第9步我们发现spring会根据标签的namespace来选择读取方式,联想spring里提供的各种标签,比如<aop:xxx>等应该会有不同的读取和解析方 ...

  5. [spring源码学习]六、IOC源码-BeanFactory和factory-bean

    https://www.cnblogs.com/jyyzzjl/p/5459335.html 一.代码实例 在我们分析spring的IOC源码的时候,发现除了配置标准的bean,并且通过getBean ...

  6. Spring源码分析之BOP/IOC/DI/AOP

    Spring是什么? 轻量级:零配置编程.API使用简单 面向Bean:只需要编写普通的对象 轻耦合:充分利用AOP(面向切面)的思想 设计模式:使用java中经典的设计模式 面向Bean-BOP:通 ...

  7. Ioc容器beanDefinition-Spring 源码系列(1)

    Ioc容器beanDefinition-Spring 源码系列(1) 目录: Ioc容器beanDefinition-Spring 源码(1) Ioc容器依赖注入-Spring 源码(2) Ioc容器 ...

  8. 工厂设计模式(java版本、spring源码中使用的工厂模式)

    最近在学习spring源码,发现在IoC容器初始化的时候创建各种bean,然后在代码中看到各种beanFactory和factoryBean,很显然spring容器在创建bean的过程是使用了工厂设计 ...

  9. beanfactorypostprocessor_Spring源码分析(六)容器的扩展点(BeanFactoryPostProcessor)

    之前的文章我写了BeanDefinition的基本概念和合并,其中很对次提到了容器的扩展点,这篇文章就写这方面的知识.这部分的内容主要涉及到官网的1.8小节.按照官网介绍来说,容器的扩展点可以分为三类 ...

最新文章

  1. linux top 命令信息解释
  2. 双样本T检验——机器学习特征工程相关性分析实战
  3. 通过系统回顾的方法来发展循证的管理知识*。
  4. LeetCode 20. 有效的括号(Valid Parentheses)
  5. html5 jquery paint plugin,制作高质量的JQuery Plugin 插件的方法
  6. mac apache2 php,Mac OSX 之 PHP开发环境Apache2配置
  7. P3317-[SDOI2014]重建【矩阵树定理,数学期望】
  8. 我在阿里云玩蟹科技分享篇
  9. 一点SICP(Structure and Interpretation of Computer Programs) 资料 (转载加整理)
  10. html5学习笔记6-- canvas
  11. 【转】SQL SERVER convert函数日期格式化应用
  12. sqlserver企业版秘钥_SqlServer2008到期升级企业版 密钥+图解
  13. 详解 Kubernetes ReplicaSet 的实现原理
  14. docker编译speccpu2017
  15. hdu 4802 GPA
  16. jmeter测试抓包
  17. 大数据 智能交通调度_当大数据邂逅智能交通
  18. 苹果手机圆圈在哪里设置_不知道苹果手机录音在哪里?那你就落伍了
  19. ansible模块临时命令
  20. PyCharm专业版安装教程

热门文章

  1. jenkins+git+gradle配置自动打apk包
  2. Structured Streaming 编程模型
  3. 关于 MATLAB 你首先要会的基础(权且可当做期末复习备考)
  4. 百胜图CTI拉花比赛上海总决赛
  5. 一个JAVA程序员经常访问的网站
  6. 奥丁软件管家解压密码汇总_管家婆财贸ERP如何做销售分析?
  7. java获取属性工具类,Java中常用的工具类总结
  8. 【知识蒸馏】Knowledge Review
  9. 原型的概念以及为什么使用原型
  10. 分布式服务架构下的身份认证