Spring容器实现初始化的流程有哪些
创始人
2024-12-29 06:42:01
0次

前言

首先我们初始化一个最简单的容器,用这个容器研究初始化的流程。

下面就是一个再简单不过的IoC容器了,该容器包含了一个名为beanA的bean,我们初始化容器后,取出该Bean,并调用方法。

public class BeanA {
 private String testStr = "Test";
 public BeanA(){
  System.out.println("Running A");
 }
 public void sayHello(){
  System.out.println("I'm beanA.");
 }
}



 
 
@Test
void testHello(){
 Resource springResource=new ClassPathResource("spring-beans.xml");
 BeanFactory beanFactory=new XmlBeanFactory(springResource);
 BeanA beanA= (BeanA) beanFactory.getBean("beanA");
	beanA.sayHello();
}

虽然XmlBeanFactory已经被Spring标记为过时,但是为了达到我们从一个xml定义的bean信息构造一个BeanFactory的目的,勉为其难,还是先用一下233。

这段代码很简单,但是反映了我们使用IoC的一个基础流程:

  1. 选择并构建数据源

  2. 利用数据源构建一个容器

  3. 取出Bean使用

我们就先从这几点一点点讲

在开始之前,需要意识到的是:Spring作为一款优秀的面向对象的框架设计,Spring中采用了大量的设计模式并按照面向对象的逻辑对各个类进行设计,做到了各个类功能单一。

这意味着,Spring的代码会有一种剥洋葱的感觉,子类对双亲扩展,调用默认实现。

选择并构建数据源

构建数据源的部分难度不大,会稍微简单点讲

这里推荐一本书:《Spring源码深度解析(第2版)》

看了Spring的设计,这是真的面向对象。

Spring一开始是使用大量的xml文件配置了容器。从面向对象的角度思考,为了方便使用,需要将各种资源都被抽象出来,先看一下他的资源类结构体系。该部分是系统最底层,在core包中

Spring容器实现初始化的流程有哪些

InputStreamSource封装能返回InputStream的类,可以返回这个流。

日常开发用Spring的体系也会很便捷。

Resource体系达到了这样的目的:对于不同的文件来源都有一种实现来读取该文件,同时,拥有一个规范的接口。

现在我们有了Resource的设计,为了读取对象,Spring提供了BeanDefinitionReader、ResourceLoader来从资源中提取出我们需要的资源内容。这些类的关系如下:

  1. Resource代表一个资源对象

  2. ResourceLoader将文件转化为Resource对象

  3. DocumentLoader将Resource对象转化为Document对象

  4. BeanDefinitionDocumentReader解析Document对象为BeanDefinitions

  5. BeanDefinitionReader抗了初始化的大梁,在new的时候会绑定一个Bean定义注册器(DefaultListableBeanFactory实现了他),后面解析后会用这个注册器注册

Spring容器实现初始化的流程有哪些

这就是大致的一个逻辑,把握住这个大致的逻辑看源码,体验要上升不少

下面是最上方的例子启动的大致的流程,大量的代码在处理读取资源的逻辑

  1. Resource代表一个资源对象

  2. Resource封装为带编码格式的EncodedResource对象

  3. XmlBeanDefinitionReader构建Document对象

  4. XmlBeanDefinitionReader内部有个DocumentLoader,读取Resource对象转化为Document对象

  5. ResourceLoader将文件转化为Resource对象

  6. DocumentLoader将Resource对象转化为Document对象

  7. Document对象转为Element对象

  8. DocumentReader读取Element对象,将信息存储在BeanDefinitionParserDelegate

  9. DocumentReader解析BeanDefinitionParserDelegate为BeanDefinitionHolder

  10. BeanDefinitionHolder获取BeanDefinitions,交给register进行注册(加锁、放map)。

  11. 返回注册的数量

Spring容器实现初始化的流程有哪些

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...