1. IoC的概念

IoC 是 Inversion of Control 的缩写,就是控制反转的意思,他是指在开发过程中,对象的创建不再由调用者处理,而是交给 Spring 容器来创建。Spring 容器会控制程序之间的关系,而是不通过代码直接控制,所以控制权有程序代码转移给了 Spring容器,控制权发生反转。简单来说就是对象生命周期统一由Spring Bean容器来管理,从程序代码手动管理对象,转变为Spring容器来管理,也就是控制权发生反转,故名为控制反转。

Spring 提供了两种 IoC容器,一种是 BeanFactory ,另一种是 ApplicationContext。

2. BeanFactory

BeanFactory 是一种基础类型的 IoC 容器,他定义自 org.springframework.beans.facytory.BeanFactory 这个接口,BeanFactory 就是一个管理 Bean 的工厂,他负责初始化各种 Bean 容器对象,并调用这些 Bean 的生命周期方法,来对存储的对象进行使用和处理。

3. ApplicationContext

ApplicationContext 是 BeanFactory 的子接口,也被称为应用上下文。它是由 org.springframework.context.ApplicationContext 来定义的。

ApplicationContext主要有两个常用的实现类,分别为 ClassPathXmlApplicationContext 和 FileSystemXmlApplicationContext 。

3.1 ClassPathXmlApplicationContext

该实现类是从类路径 ClassPath 中来寻找指定的 XML 配置文件,找到并且加载完成 ApplicationContext 的实例化工作。

代码如下:

ApplicationContext context = new ClassPathXmlApplicationContext(String configLocation);

其中 configLocation 参数是来制定 Spring 配置文件的名称和位置。

3.2 FileSystemXmlApplicationContext

该实现类是从指定的文件系统路径中寻找到指定的 XML 配置文件,并完成实例化工作。

代码如下:

ApplicationContext context = new FileSystemXmlApplicationContext(String configLocation);

这里和 ClassPathXmlApplicationContext 的主要区别就是,在读取 Spring 的配置文件时,FileSystemXmlApplicationContext 不会从类路径中读取配置文件,而是通过参数指定的系统中的配置文件位置,来货渠道类路径以外的资源,例如:“D:/springwork/applicationContext.xml”。

4. 区别

BeanFactory 和 ApplicationContext 都是通过 XML 配置文件来加载 Bean 的。

二者的区别主要在于,如果 Bean 的其中一个属性没有注入的话,在使用 BeanFactory 加载之后,第一次调用 getBean() 方法会抛出一个异常,但是 ApplicationContext 在初始化时会进行检验,这样就能够检查出 Bean 所依赖的属性是否已经注入。

大部分情况下使用 ApplicationContext 的频率会更高。BeanFactory 通常在系统资源比较少时会使用到。

Spring注册和装配Bean的基本原理

加载并解析配置文件,通过反射+ASM字节码技术创建Bean对象并设置对象属性。