2.1 Spring IoC容器概述
Spring 容器是 Spring 框架的核心。 容器将创建对象、将它们连接在一起、配置它们并管理它们从创建到销毁的完整生命周期。 Spring 容器使用 DI 管理构成应用程序的组件。 这些对象称为 Spring Bean。
容器通过读取提供的配置元数据来获取关于要实例化、配置和组装哪些对象的指令。 配置元数据可以由 XML、Java 注解或 Java 代码表示。 下图展示了 Spring 工作原理的高级视图。 Spring IoC 容器利用 Java POJO 类和配置元数据来生成一个完全配置和可执行的系统或应用程序。
Spring IoC负责创建对象、管理对象(通过依赖注入(DI)、装配对象、配置对象,并且管理这些对象的整个生命周期。
其实IoC包括依赖查找(DL)和依赖注入(DI);只不过DL因为有侵入性 (它需要用户自己去是使用 API 进行查找资源和组装对象),已经被抛弃。所以现在提到IoC,更多的想到的就是依赖注入(DI)了。
- IOC: Spring 反向控制应用程序需要的资源。
- DI: 应用程序依赖Spring为其提供资源。
其中的DI—Dependency Injection,即“依赖注入”:组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中。依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现。
理解DI的关键是:“谁依赖谁,为什么需要依赖,谁注入谁,注入了什么”。
谁依赖于谁:
- 当然是应用程序依赖于IoC容器;
为什么需要依赖:
- 应用程序需要IoC容器来提供对象需要的外部资源;
谁注入谁:
- 很明显是IoC容器注入应用程序某个对象,应用程序依赖的对象;
注入了什么:
- 就是注入某个对象所需要的外部资源(包括对象、资源、常量数据)。
2.1.1IoC容器的依赖反转模式
依赖反转是一种软件设计原则,它使得高层模块不依赖于低层模块的具体实现,而是依赖于抽象接口或者抽象类。
在传统的开发中,对象的创建和管理通常由对象自身负责,一个对象会直接创建并管理其所依赖的其他对象。这种情况下,高层模块对低层模块的实现产生了依赖,导致代码的耦合度增加。
具体来说,Spring的IoC容器将对象的创建和管理以及对象间的依赖关系的处理交给了容器来完成。开发人员只需要在配置文件或注解中声明对象的依赖关系,而不需要显式地去创建对象或解决对象之间的依赖。
org.springframework.beans
和 org.springframework.context 包是Spring Framework
的IoC容器的基础。 BeanFactory
接口提供了一种高级配置机制,能够管理任何类型的对象。 ApplicationContext
是 BeanFactory
的一个子接口。它增加了:
- 更容易与Spring的AOP功能集成
- Message resource 处理(用于国际化)
- 事件发布
- 应用层的特定上下文,如 WebApplicationContext,用于 web 应用
简而言之,BeanFactory 提供了配置框架和基本功能,而 ApplicationContext 则增加了更多的企业特定功能。ApplicationContext 是 BeanFactory 的一个完整的超集。
在Spring中,构成你的应用程序的骨干并由Spring IoC容器管理的对象被称为Bean。Bean是一个由Spring IoC容器实例化、组装和管理的对象。否则,Bean只是你的应用程序中众多对象中的一个。Bean以及它们之间的依赖关系都反映在容器使用的配置元数据中。
2.1.2 IoC容器的两种表现形式
容器 | 描述 |
Spring BeanFactory 容器 |
这是为 DI 提供基本支持的最简单的容器,由 org.springframework.beans.factory.BeanFactory 接口定义。 Spring 中仍然存在 BeanFactory 及其相关接口,如BeanFactoryAware 、InitializingBean 、DisposableBean ,目的是为了向后兼容大量与 Spring 集成的第三方框架。 |
Spring ApplicationContext 容器 |
此容器添加了更多特定于企业的功能,例如从属性文件解析文本消息的能力以及将应用程序事件发布到感兴趣的事件侦听器的能力。 这个容器由 org.springframework.context.ApplicationContext 接口定义。 |
2.1.3 IoC容器的介绍和使用:
BeanFactory容器的使用:
这是为 DI 提供基本支持的最简单的容器,由 org.springframework.beans.factory.BeanFactory 接口定义。 Spring中仍然存在BeanFactory及其相关接口,如BeanFactoryAware、InitializingBean、DisposableBean,目的是为了向后兼容大量与Spring集成的第三方框架。
有许多 BeanFactory 接口的实现直接随 Spring 提供。 最常用的 BeanFactory 实现是 XmlBeanFactory 类。 此容器从 XML 文件中读取配置元数据,并使用它来创建完全配置的系统或应用程序。
在资源有限的情况下,如移动设备或基于小程序的应用程序,BeanFactory 通常是首选。 因此,除非您有充分的理由不这样做,否则请使用 ApplicationContext。
public static void main(String[] args){ //ClassPathResource加载在路径CLASSPATH下可用的xml配置文件 //XmlBeanFactory负责创建并初始化所有对象即xml文件中的bean XmlFactory factory = new XmlBeanFactory(new ClassPathResource("_.xml")); 类名 对象名 =(类名)factory.getBean("_"); }
ApplicationContext 容器的使用:
Application Context 应用程序上下文是 Spring 的高级容器。 与 BeanFactory 类似,它可以加载 bean 定义、将 bean 连接在一起并根据请求分发 bean。 此外,它还添加了更多特定于企业的功能,例如从属性文件解析文本消息的能力以及将应用程序事件发布到感兴趣的事件侦听器的能力。 该容器由 org.springframework.context.ApplicationContext 接口定义。
常用的 ApplicationContext 实现:
FileSystemXmlApplicationContext
− 这个容器从一个 XML 文件中加载 bean 的定义。 这里需要将 XML bean 配置文件的完整路径提供给构造函数。ClassPathXmlApplicationContext
− 这个容器从一个 XML 文件中加载 bean 的定义。 这里您不需要提供 XML 文件的完整路径,但您需要正确设置 CLASSPATH,因为此容器看起来像 CLASSPATH 中的 bean 配置 XML 文件。WebXmlApplicationContext
− 此容器从 Web 应用程序中加载包含所有 bean 定义的 XML 文件。
public static void main(String[] args){ //ApplicationContext接口的实现类有很多种,这里使用ClassPathXmlApplicationContext ApplicationContext app = new ClassPathXmlApplicationContext("_.xml"); 类名 对象名 =(类名)app.getBean("_"); }
下期预告: Bean 概述以及如何构建和使用容器
一个Spring IoC容器管理着一个或多个Bean。这些Bean是用你提供给容器的配置元数据创建的(例如,以XML 定义的形式)。
在容器本身中,这些Bean定义被表示为 BeanDefinition 对象,它包含(除其他信息外)以下元数据。
- 一个全路径类名:通常,被定义的Bean的实际实现类。
- Bean的行为配置元素,它说明了Bean在容器中的行为方式(scope、生命周期回调,等等)。
- 对其他Bean的引用,这些Bean需要做它的工作。这些引用也被称为合作者或依赖。
- 要在新创建的对象中设置的其他配置设置—例如,pool的大小限制或在管理连接池的Bean中使用的连接数。
写在后面🔥🔥🔥:
本专栏是自己深入学习并结合Spring技术内幕一经典图书内容做出的的心得与总结,将其精简编写成一篇专栏供大家学习,希望对新学习Spring框架技术的小伙伴有所帮助。
图书推荐: