Spring IoC 容器详解 [Spring][IoC 控制反转][BeanFactory][ApplicationContext]

您的“关注”和“点赞”,是信任,是认可,是支持,是动力......

如意见相佐,可留言。
本人必将竭尽全力试图做到准确和全面,终其一生进行修改补充更新。

目录

1 Spring IoC 概述

Spring IoC,全称 Spring Inversion of Control ,控制反转。

IoC(控制反转) 是指在程序开发中,实例的创建不再由调用者管理,而是由 Spring 容器创建。Spring 容器会负责控制程序之间的关系,而不是由程序代码直接控制,因此,控制权由程序代码转移到了 Spring 容器中,控制权发生了反转,这就是 Spring 的 IoC 思想。

简单理解,IoC(控制反转)就是控制权的转移,即把创建(new)对象的权利,反转给第三方Spring 框架去创建(new)。也就是把对象的创建的权利及对象的生命周期的管理过程交由Spring 框架来处理,从此在开发过程中不再需要关注对象的创建和生命周期的管理,而是在需要时由 Spring 框架提供,这个由 Spring 框架管理对象创建和生命周期的机制称之为控制反转。而在创建对象的过程中 Spring 可以依据配置对对象的属性进行设置,这个过称之为依赖注入,也即 DI。

示意如下所示:

# 以前

User user = new User();  // 由程序员控制 new 对象
# 现在:

现在 Spring 容器来创建对象
User user = spring容器.get对象("容器中的唯一对象Id");

2 Spring 提供两种 IoC 容器

2.1 BeanFactory

BeanFactory 是基础类型的 IoC 容器,它由 org.springframework.beans.facytory.BeanFactory 接口定义,并提供了完整的 IoC 服务支持。

简单理解,BeanFactory 就是一个管理 Bean 的工厂,它主要负责初始化各种 Bean,并调用它们的生命周期方法。

BeanFactory 接口有多个实现类,最常见的如下所示:

  • org.springframework.beans.factory.xml.XmlBeanFactory:它是根据 XML 配置文件中的定义装配 Bean 的。

创建 BeanFactory 实例时,需要提供 Spring 所管理容器的详细配置信息,这些信息通常采用 XML 文件形式管理。

其加载配置信息的代码具体如下所示:

BeanFactory beanFactory = new XmlBeanFactory(new FileSystemResource("D://applicationContext.xml"));

2.2 ApplicationContext

ApplicationContext 接口的全路径为 org.springframework.context.ApplicationContext,它不仅提供了 BeanFactory 的所有功能,还添加了对 i18n(国际化)、资源访问、事件传播等方面的良好支持。

ApplicationContext 是 BeanFactory 的子接口,也被称为应用上下文。

ApplicationContext 接口有两个常用的实现类,具体如下所示:

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

    # configLocation 参数:用于指定 Spring 配置文件的名称和位置,如 applicationContext.xml。
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext(String configLocation);
  • FileSystemXmlApplicationContext
    该类从指定的文件系统路径中寻找指定的 XML 配置文件,找到并装载完成 ApplicationContext 的实例化工作,具体如下所示:

    ApplicationContext applicationContext = new FileSystemXmlApplicationContext(String configLocation);

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

使用 Spring 框架,当要创建 ApplicationContext 容器时,可以实例化任何一个类(ClassPathXmlApplicationContext 或 FileSystemXmlApplicationContext)。建议如下所示:

  • Java 项目中:通常会采用通过 ClassPathXmlApplicationContext 类实例化 ApplicationContext 容器的方式。
  • Web 项目中:是 Web 服务器完成实例化 ApplicationContext 容器的工作。Web 服务器实例化 ApplicationContext 容器通常使用基于 ContextLoaderListener 实现的方式,它只需要在 web.xml 中添加如下代码:
    <!--指定Spring配置文件的位置,有多个配置文件时,以逗号分隔-->
    <context-param>
    <param-name>contextConfigLocation</param-name>
    <!--spring将加载spring目录下的applicationContext.xml文件-->
    <param-value>
        classpath:spring/applicationContext.xml
    </param-value>
    </context-param>
    <!--指定以ContextLoaderListener方式启动Spring容器-->
    <listener>
     <listener-class>
       	 org.springframework.web.context.ContextLoaderListener
     </listener-class>
    </listener>

3 BeanFactory 和 ApplicationContext 的异同

  • 异:如果 Bean 的某一个属性没有注入,则使用 BeanFacotry 加载后,在第一次调用 getBean() 方法时会抛出异常,而 ApplicationContext 则在初始化时自检,这样有利于检查所依赖的属性是否注入。
  • 同:BeanFactory 和 ApplicationContext 都是通过 XML 配置文件加载 Bean 的。

介绍到这里,相信大家心里都有一个“理想对象”了吧?
那就是 ApplicationContext,在日常开发中通常选择使用的都是这个接口,只有在系统资源较少时,才考虑一下 BeanFactory 哦。

4 文章其他地址

4.1 微信公众号:码农阿杰

4.2 CSDN 博客

5 参考资料

5.1 spring

5.2 Artifact Repository Browser

5.3 Apache Commons

相关推荐