一.前言
现在我们把主要的类讲了一部分,下面我们来看看 Spring 是如何启动的.
DefaultListableBeanFactory 作为一个默认的功能完整的 IOC 容器来使用.那我们就从它来入手.
二. XmlBeanFactory
2.1 描述
XmlBeanFactory 是 DefaultListableBeanFactory 唯一的子类(已有 @Deprecated 注解), Spring 提示我们现在不建议使用这个类了,后面的版本中可能删除了.但是作为元老级别 IOC 容器,我们还是从这个实现类来跟踪,还可以方便我们后期对 ApplicationContext (应用上下文,容器高级封装) 和 BeanFactory 做对比.看看 ApplicationContext 到底是怎么高级的.
XmlBeanFactory 在继承了 DefaultListableBeanFactory 容器的功能的同时.增加了一部分功能,很容易从 XmlBeanFactory 的名字上猜到,它是一个 xml 相关的 BeanFactory ,也就是说他是一个可以读取以 xml 文件方式定义的 BeanDefinition 的 IOC 容器.
2.2 IOC 容器中的 Bean
我们知道 IOC 容器中存放着我们注册的 bean,但是 bean 是如果注册到 ioc 容器的呢? 这里我们就从本文所要演示的 XMLBeanFactory 来说起.我们在很早以前使用 spring 的时候,大多数使用的 xml 的形式定义 bean(即 <bean>
标签).
既然是 xml 的形式定义 bean ,那么 spring 是如果定位 xml ,又是如何加载, 如何解析,如何注册到 IOC 中,最后如何实例化成我们需要的 bean 呢?
这就是我们后面要研究的问题了.
2.3 IOC 容器启动步骤
首先看一张图:
图中描述了 IOC 容器启动的步骤,简单描述就是
- 资源定位
- 资源载入
- 资源注册
注册完毕后,一个完整的 BeanFactory 就创建完毕,然后就是使用容器中的对象.
注意要点:
ioc 容器初始化过程中,一般不包含 Bean 依赖注入的实现, 在 spring ioc 的设计中,Bean 定义的载入和依赖注入是两个独立的过程. 依赖注入一般发生在应用第一次通过 getBean 向容器索取 Bean 的时候.
但有一个例外值得注意, 在使用 ioc 容器时有一个预实例化的配置,通过这个预实例化的配置(lazyinit) ,从而改变这个被设置了 lazyinit 属性的 bean 的注入过程,
举例说明,如果我们对某个 Bean 设置了 lazyinit 属性,那么这个 bean 的依赖注入在 ioc 容器初始化时就预先完成了,而不需要等到整个初始化完成以后,第一次使用 getBean 时才会触发.