Spring启动初始化基础对象及属性
首先我们以解析xml文件的形式启动一个Spring容器,来看一下Spring容器为我们做了哪些事情
创建 ClassPathXmlApplicationContext
super(parent)
首先在创建ClassPathXmlApplicationContext对象时会通过一系列的super(parent) 最终调用到父类AbstractApplicationContext的有参构造方法。
this() 初始化属性
- 例如创建容器的唯一标识Id
- 创建标志位active closed 标志是活动状态还是关闭状态
- 创建锁(这个锁在refresh()刷新容器的时候会使用到)
- 创建资源解析器(因为我们这里是采用Xml的方式去初始化的,所以对应也会创建XMl的解析器,所有解析器都有一个共同的接口ResoureLoader)
- 等等.....
setParent(parent)设置父容器
这个parent在这里为null,因为spring本身是一个基础容器所以不存在父容器,在SpringMvc中就会存在父容器,如果有父容器则会获取父容器的Environment环境变量进行相应的合并操作
扩展知识
在完成AbstractApplicationContext的初始化之后会回到子类AbstractXmlApplicationContext,在AbstractXmlApplicationContext中会初始化一个属性validating=true,这个属性代表检查xml文件规范,xml文件有dtd,xsd规范,这些规范会定义在xml的头文件中,我们也可以在项目的META—INF下找到一个spring.schemas的文件,这个文件中标识了文件规范的路径,因为我们现在在idea中开发,所以这些规范会提前缓存在我们本地,以前在用Eclipse开发时,我们经常会因为网络原因,导致去解析XMl规范Url时网络异常,从而导致Xml文件一直报错不通过。
setConfigLocations(configLocations)
在完成以上父类跟子类的属性初始化之后会就调用到了setConfigLocations(configLocations)将配置文件路径设置到全局环境变量中。
由于刚开始初始化还不存在全局变量的容器对象。所以会初始化一个Enviroment对象。
初始化Environment对象
最终会创建出一个StandardEnvironment对象,里面包含的两个属性
- systemEnvironment表示当前系统的环境属性
- systemProperties表示当前系统的配置信息。
- 首先默认调用父类AbstractEnvironment的构造方法初始化,在AbstractEnvironment中会定义一些配置的名字,其中最常见的就是spring.active.profile 可以设置配置文件的环境当前使用的(如dev开发环境,测试环境,生产环境之类)
😊
小结
以上内容主要包含了Spring在启动时候初始化创建的一些基础对象以及属性