从前面的ApplicationContext的设计原理中我们可以看到,在设计原理的第一个功能之上我们能够看见refresh()方法完成了容器的初始化,这一个部分其实就是对refresh()进行完整的解析过程在refresh进行容器初始化的这个过程中其实是分为三个部分进行的:资源定位 资源的载入 将BeanDefinition注册到ioc容器中去
这三个部分其实是异步完成 通过不同的模块进行对他们处理的,例如使用ResourceLoader, BeanDifinitionReader这些模块对
-
第一部分:资源的定位
从他的名字来看就是对BeanDefinition的资源定位,在Spring中他是通过ResourceLoader提供一个统一的Resource接口来完成的,这个Resourcedui各种的beandefinition使用都提供了统一的接口
举个例子来说对文件中的BeanDifinition就可以使用FileSystemResource来对BeanDifiition来进行定位,不同的是对于类的路径可以使用ClassPathResource来对它进行定位 -
第二部分的: 资源的载入
其实就是说对用户说,就是将用户定义好的bean对象表示成ioc容器的数据结构这种模式,也就是我们现在常说的BeanDifinition这样一个对象 -
第三部分: 资源的注册
就是向ioc容器注册beanDifintion数据结构的过程,这个过程主要是通过BeanDefinitionRegisty接口来完成的,通过第二步的载入分析之后的BeanDifiniton向ioc容器进行注册的过程,主要的步骤就是说将这些BeanDifinition添加进入一个HashMap集合中,通过HashMap来对BeanDifinition进行管理
注意点:BeanDifinition初始化中的载入与依赖载入不是一个说法,他们是两个不同的过程
但是有一个意外就是说在对Bean实例进行设置bean的lazyinit属性,在完成初始化之前就已经对Bean进行来注入
一般我们来讲就是当容器执行了getBean()这个方法时,我们才会将Bean对象注入到