Spring的两种IoC容器
- BeanFactory
- 基础类型的IoC容器;
- 采用延迟初始化策略(容器初始化完成后并不会创建bean的对象,只有当收到初始化请求时才进行初始化);
- 由于延迟初始化,因此启动速度较快,占用资源较少;
- ApplicationContext
- 在BeanFactory的基础上,增加了更为高级的特定:事件发布、国际化等;
- 在容器启动时便完成所有bean的创建;
- 启动时间较长,占用资源更多;
IoC容器的主要类/接口介绍
BeanFactory
它是一个接口,提供了获取容器中Bean的相关方法。BeanDefinitionRegistry
它才是IoC的容器,用于存储、管理所有的Bean对象。DefaultListableBeanFactory
它是IoC容器的一个具体实现,实现了BeanFactory和BeanDefinitionRegistry接口,因此既拥有管理Bean的容器,又拥有访问Bean的方法。BeanDefinition
每一个Bean都有一个BeanDefinition与之对应,用于存储Bean的相关信息:对象的class类型、是否是抽象类、构造方法参数等。
RootBeanDefinition和ChildBeanDefinition是BeanDefinition的两个主要的实现类。BeanDefinitionReader
在Spring中,标注Bean的依赖关系有四中方式:- 直接在代码中声明
- 通过XML文件声明
- 通过Properties文件声明
- 通过注解声明
BeanDefinitionReader接口的作用就是读取配置文件中的bean信息,把它们解析成BeanDefinition对象,然后注册到BeanDefinitionRegistry中去。
PropertiesBeanDefinitionReader和XmlBeanDefinitionReader是该接口的两个实现类,分别用于解析properties和xml格式的配置文件。
XmlBeanFactory
它是一个集成了XmlBeanDefinitionReader功能的BeanFactory,用于简化初始化操作。
BeanFactory的两个重要阶段
容器启动阶段
该阶段Spring会使用BeanDefinitionReader加载配置文件,并把所有的bean解析成BeanDefinition对象,并注册到BeanDefinitionRegistry。Be