1。前言在学校的时候,老师总是说:不懂就问,但很多时候是不知道问什么!你总会发现一些关于成长、学习、领悟和当前文章内容的介绍,其实之所以写这样的铺垫内容,主要是为了让大家能够更轻松的打开和过渡到下一篇内容学习。就像我们在学校的时候,如果某个科目的内容我们不知道,老师经常说,如果你不知道,你就得问。但是对于学生自己来说,他们可能知道的不多,或者根本不知道什么是自己做不到的。只有当他们看到老师做完的试卷时,他们才会发现自己什么都不会。但是问了也不知道从哪里问,问了就萝卜泥,到处都是知识漏洞。所以我希望通过一些前置内容的铺垫,让大家在有一点共识的场景中学习,或多或少可以为大家有个稍微温和的接受期做铺垫。有可能在某个时候,也是一场大屠杀,刺激学习,把知识学好就好!二、目标SpringBean容器是什么?Spring包含并管理应用程序对象的配置和生命周期。从这个意义上说,它是一个承载对象的容器。您可以配置每个Bean对象的创建方式。这些Bean可以在每次需要时创建一个单独的实例或生成一个新实例,以及它们是如何构建和相互关联使用的。如果一个Bean对象交给Spring容器管理,那么Bean对象也应该以类似的方式拆解,存储在Bean定义中。这相当于对对象进行了一次解耦操作,Spring可以更轻松地处理。管理,如处理循环依赖等。一个Bean对象在定义和存储后,由Spring统一组装。这个过程包括Bean初始化,属性填充等,最后我们就可以完整的使用一个Bean实例化对象了。而我们本章的案例目标是定义一个简单的Spring容器,用于定义、存储和获取Bean对象。3.设计任何能够存储数据的特定数据结构的实现都可以称为容器。例如:ArrayList、LinkedList、HashSet等,但是在SpringBean容器场景下,我们需要一个可以用于存储和名称索引的数据结构,那么HashMap是最合适的选择。这里简单介绍一下HashMap。HashMap是一种基于扰动函数、负载因子、红黑树转换等技术内容的拉链寻址数据结构。它可以使数据更加散列分布在哈希桶和碰撞形成的链表和红黑树中。它的数据结构会将读取整个数据的复杂度最大化在O(1)~O(Logn)~O(n)之间,当然在极端情况下也会有O(n)链表查找量大的情况数据的。但是我们已经通过了10万条数据的扰动函数重寻址验证测试,数据会在每个哈希桶索引上进行统一哈希,所以HashMap非常适合在SpringBean容器实现中使用。另一个简单的SpringBean容器实现需要Bean定义、注册、获取三个基本步骤。简化设计如下;Definition:BeanDefinition,可能这是你查看Spring源码时经常看到的一个类,比如,它会包含singleton,prototype,BeanClassName等。但是目前我们的初步实现会比较简单,只定义一个Object类型来存储对象。注册:这个过程相当于在HashMap中存储数据,只不过现在HashMap存储的是定义的Bean的对象信息。获取:最后是获取对象。bean的名称是关键。Spring容器初始化bean后,可以直接获取。接下来,我们就按照这个设计,做一个简单的SpringBean容器代码实现。编码过程往往不是很复杂,但了解设计过程更重要!四、实现1、项目结构small-spring-step-01└──src├──main│└──java│└──cn.bugstack.springframework│├──BeanDefinition.java│└──BeanFactory.java└──test└──java└──cn.bugstack.springframework.test├──bean│└──UserService.java└──ApiTest.java项目源码:https://github.com/small-spring/small-spring-step-01(公众号:bugstack虫洞栈,回复:Spring专栏,获取整套源码)SpringBean容器类关系,如图2-2图2-2整个实现SpringBean容器的结构非常简单,它只包含了一个简单的BeanFactory和BeanDefinition。这里的类名与Spring源码保持一致,但是目前的类实现相对来说会更加简化,在后续的实现过程中会不断增加内容。BeanDefinition用于定义Bean实例化信息。目前的实现是用一个Object来存放对象BeanFactory,代表Bean对象的工厂,可以将Bean定义存放在Map中并获取。2、Bean定义publicclassBeanDefinition{privateObjectbean;publicBeanDefinition(Objectbean){this.bean=bean;}publicObjectgetBean(){returnbean;}}在目前的Bean定义中,只有一个Object用来存放Bean对象。有兴趣的可以参考Spring源码中这个类的资料,名字是一样的。不过在后续的实现中,BeanDefinition相关属性的填充会逐步完善,比如:SCOPE_SINGLETON、SCOPE_PROTOTYPE、ROLE_APPLICATION、ROLE_SUPPORT、ROLE_INFRASTRUCTURE和BeanClass信息。3.Bean工厂publicclassBeanFactory{privateMap
