1. 创建简单的Bean容器
1. 创建简单的Bean容器
对照子工程 lqf-spring-step-01
工程结构

Spring Bean 容器的整个实现内容非常简单,也仅仅是包括了一个简单的 BeanFactory 和 BeanDefinition,这里的类名称是与 Spring
源码中一致,只不过现在的类实现会相对来说更简化一些,在后续的实现过程中再不断的添加内容。
- BeanDefinition,用于定义 Bean 实例化信息,现在的实现是以一个 Object 存放对象。
- BeanFactory,代表了 Bean 对象的工厂,可以存放 Bean 定义到 Map 中以及获取。
设计
凡事可以存放数据的具体数据结构实现,都可以称之为容器。例如:ArrayList、LinkedList、HashSet等,在SpringBean容器的场景下,需要一种可以存放和名称索引式的数据结构,所以选择HashMap式最合适的。
HashMap是一种给予扰动函数、负载因子、红黑树转换等技术内容,形成的拉链寻址的数据结构,它能让数据更加散列的分布在哈希桶以及碰撞时形成的链表和红黑树上。
它的数据结构会尽可能最大限度的让整个数据读取的复杂度在 O(1) ~ O(Logn) ~O(n)之间,当然在极端情况下也会有 O(n)
链表查找数据较多的情况。不过我们经过10万数据的扰动函数再寻址验证测试,数据会均匀的散列在各个哈希桶索引上,所以 HashMap
非常适合用在 Spring Bean 的容器实现上。
另外一个间的的Spring Bean 容器实现,还需要Bean的定义、注册、获取三个基本步骤,简化设计如下:

- 定义:BeanDefinition,在查阅Spring源码时经常看到的一个类,例如它会包括singleton、prototype、BeanClassName等。目前初步实现会更加简单的处理,只定义一个Object类型用于存放对象。
- 注册:这个过程就相当于把数据存放到HashMap中,只不过现在HashMap存放的是定义了Bean的对象信息。
- 获取:最后就是获取对象,Bean的名字就是key,Spring 容器初始化好 Bean 后,就可以直接获取了。
实现
Bean 定义
源码详见: lqf.springframework.BeanDefinition
- 目前的 Bean 定义中,只有一个 Object 用于存放 Bean 对象。如果感兴趣可以参考 Spring 源码中这个类的信息,名称都是一样的。
- 在后面陆续的实现中会逐步完善 BeanDefinition 相关属性的填充。
Bean 工厂
源码详见: lqf.springframework.BeanFactory
- 在 Bean 工厂的实现中,包括了 Bean 的注册,这里注册的是 Bean 的定义信息。同时在这个类中还包括了获取 Bean 的操作。
- 目前的 BeanFactory 仍然是非常简化的实现,但这种简化的实现内容也是整个 Spring 容器中关于 Bean
使用的最终体现结果,只不过实现过程只展示出基本的核心原理。在后续的补充实现中,这个会不断变得庞大。
总结
- 关于 Spring Bean 容器的一个雏形就已经实现完成了,相对来说这部分代码并不会难住任何人,只要稍加尝试就可以接受这部分内容的实现。
- 对于一个知识的学习来说,写代码只是最后的步骤,往往整个思路、设计、方案,才更重要,只要知道了因为什么、所以什么,才能有一个真正的理解。
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 iAuzre
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果
音乐天地