天天看点

Spring IoC 容器的理解Spring IoC 容器

Spring IoC 容器

IoC是什么

  • IoC (全名Inversion of Control,即控制反转)是指在程序开发中,实例的创建不再由调用者管理,而是由 Spring 容器创建。
  • Spring 容器会负责控制程序之间的关系,而不是由程序代码直接控制,因此,控制权由程序代码转移到了 Spring 容器中,控制权发生了反转,这就是 Spring 的 IoC 思想。
  • Spring 提供了两种 IoC 容器,分别为 BeanFactory 和 ApplicationContext,接下来将针对这两种 IoC 容器进行详细讲解。

BeanFactory

  • BeanFactory 是基础类型的 IoC 容器,提供了完整的 IoC 服务支持。简单来说,BeanFactory 就是一个管理 Bean 的工厂,用于创建,配置,管理bean,bean之间的依赖关系也由BeanFactory负责维护。
  • BeanFactory对bean的实例化过程,无须bean的调用者关心,调用者只需要通过getBean()方法获得指定bean的引用。
  • BeanFactory有个ApplicationContext子接口,该接口比BeanFactory增强了更多的功能,该接口的实例有时被称为Spring的上下文,通常都应该考虑ApplicationContext接口,只有非常关注内存的情况下,才考虑使用BeanFactory。

ApplicationContext

  • ApplicationContext 是 BeanFactory 的子接口,也被称为应用上下文。该接口比BeanFactory增强了更多的功能。
  • ApplicationContext 接口有两个常用的实现类,具体如下
    • ClassPathXmlApplicationContext
      该类从类路径 ClassPath 中寻找指定的 XML 配置文件,找到并装载完成 ApplicationContext 的实例化工作,具体如下所示

      ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:/springTest.xml");

    • FileSystemXmlApplicationContext
      该类从指定的文件系统路径中寻找指定的 XML 配置文件,找到并装载完成 ApplicationContext 的实例化工作,具体如下所示

      ApplicationContext applicationContext = new FileSystemXmlApplicationContext("G:\spring-framework-master\spring-context\src\main\resources\springTest.xml");

      它与 ClassPathXmlApplicationContext 的区别是:在读取 Spring 的配置文件时,FileSystemXmlApplicationContext 不再从类路径中读取配置文件,而是通过参数指定配置文件的位置,它可以获取类路径之外的资源。

BeanFacotry 与ApplicationContext 区别

二者的主要区别在于,如果 Bean 的某一个属性没有注入,则使用 BeanFacotry 加载后,在第一次调用 getBean() 方法时会抛出异常,而 ApplicationContext 则在初始化时自检,这样有利于检查所依赖的属性是否注入。