Spring源码-Spring启动初始化基础对象及属性

136 阅读2分钟

Spring启动初始化基础对象及属性

首先我们以解析xml文件的形式启动一个Spring容器,来看一下Spring容器为我们做了哪些事情

image.png

创建 ClassPathXmlApplicationContext

image.png

super(parent)

首先在创建ClassPathXmlApplicationContext对象时会通过一系列的super(parent) 最终调用到父类AbstractApplicationContext的有参构造方法。

image.png

this() 初始化属性

  • 例如创建容器的唯一标识Id
  • 创建标志位active closed 标志是活动状态还是关闭状态
  • 创建锁(这个锁在refresh()刷新容器的时候会使用到)
  • 创建资源解析器(因为我们这里是采用Xml的方式去初始化的,所以对应也会创建XMl的解析器,所有解析器都有一个共同的接口ResoureLoader)
  • 等等.....

image.png

setParent(parent)设置父容器

这个parent在这里为null,因为spring本身是一个基础容器所以不存在父容器,在SpringMvc中就会存在父容器,如果有父容器则会获取父容器的Environment环境变量进行相应的合并操作

扩展知识

image.png

在完成AbstractApplicationContext的初始化之后会回到子类AbstractXmlApplicationContext,在AbstractXmlApplicationContext中会初始化一个属性validating=true,这个属性代表检查xml文件规范,xml文件有dtd,xsd规范,这些规范会定义在xml的头文件中,我们也可以在项目的META—INF下找到一个spring.schemas的文件,这个文件中标识了文件规范的路径,因为我们现在在idea中开发,所以这些规范会提前缓存在我们本地,以前在用Eclipse开发时,我们经常会因为网络原因,导致去解析XMl规范Url时网络异常,从而导致Xml文件一直报错不通过。

image.png

image.png

setConfigLocations(configLocations)

在完成以上父类跟子类的属性初始化之后会就调用到了setConfigLocations(configLocations)将配置文件路径设置到全局环境变量中。

由于刚开始初始化还不存在全局变量的容器对象。所以会初始化一个Enviroment对象。

image.png

初始化Environment对象

最终会创建出一个StandardEnvironment对象,里面包含的两个属性

  • systemEnvironment表示当前系统的环境属性
  • systemProperties表示当前系统的配置信息。

image.png

  • 首先默认调用父类AbstractEnvironment的构造方法初始化,在AbstractEnvironment中会定义一些配置的名字,其中最常见的就是spring.active.profile 可以设置配置文件的环境当前使用的(如dev开发环境,测试环境,生产环境之类)

image.png

😊

小结

以上内容主要包含了Spring在启动时候初始化创建的一些基础对象以及属性

下一章会进行解析Spring著名的refresh()