原文: https://javatutorial.net/java-spring-ioc-container-example

简而言之,IoC 容器负责实例化/创建和配置对象以及组装对象之间的依赖关系。

Java Spring IoC 容器示例 - 图1

您可能想知道.. IoC 容器如何接收执行上述操作的数据? 答案来自 3 个地方中的 1 个:XML 文件,Java 代码或 Java 注解。

IoC 容器是 Spring 中的一个框架,用于管理 POJO(普通的旧 Java 对象)的生命周期,并在需要时将其插入 Java 程序中。

通常,Java 对象通过两种方式声明其依赖项:

  1. 通过将它们作为参数传递给构造函数
  2. 通过将它们作为参数传递给对象的 setter 方法

Spring IoC 容器的基础有两个软件包:org.springframework.beansorg.springframework.context

BeanFactory 接口管理许多 Bean,同时,这些 Bean 之间也具有依赖关系。 它提供了基本功能,更重要的是,它提供了ApplicationContext,它是BeanFactory的子接口。 在应用程序运行时,它是只读的;如果实现允许并管理 Bean 的生命周期,则可以重新加载它。

此时,依赖关系不是由 Java 对象管理,而是由框架管理。 倒置 (如果您知道我的意思)。

配置元数据是赋予与我在本教程开始时提到的任务相关的指令的术语 - 对象的实例化,配置和组装。

Java Spring IoC 容器示例 - 图2

从上图可以看到,本质上发生的是配置元数据(对象的实例化,配置和组装),并且 JOVO 正在传递到 IOC 容器(很可能是ApplicationContext的实例)。

如何实例化ApplicationContext

  1. ApplicationContext context = new ClassPathXmlApplicationContext("services.xml");

ApplicationContext也视为简单的配置。 它从 XML 文件或注释中加载“配置”。 需要在应用程序的开头创建ApplicationContext,以便它读取应用程序读取所需的所有内容。

以防万一,您可以在应用程序中包含许多ApplicationContext。 您甚至可以使它们从同一配置文件读取。 这是个好习惯吗? 取决于您要实现的目标。 大多数人会建议将所有 bean 配置在一个位置(通过 XML 或另一个位置)并由单个应用程序上下文加载。

以下示例取自原始 Spring 文档,请随时查看以获取有关 Spring 的深入了解。

services.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. http://www.springframework.org/schema/beans/spring-beans.xsd">
  6. <!-- services -->
  7. <bean id="petStore"
  8. class="org.springframework.samples.jpetstore.services.PetStoreServiceImpl">
  9. <property name="accountDao" ref="accountDao"/>
  10. <property name="itemDao" ref="itemDao"/>
  11. <!-- additional collaborators and configuration for this bean go here -->
  12. </bean>
  13. <!-- more bean definitions for services go here -->
  14. </beans>

同样,您可以将services.xml视为配置文件,然后将ApplicationContext加载/读取。

结论

当您只用简单的 DI(依赖注入)而无法使用时,为什么还要使用 IoC 容器?

好吧,这里有几个原因:

  1. 优雅
  2. 易于在生产和测试模式之间进行切换

    1. 只需更改配置

但是有一个缺点,那就是有时正确地实现 IoC 容器有些棘手。