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 哦。