# Spring – IoC 容器

> 原文： [https://howtodoinjava.com/spring-core/different-spring-ioc-containers/](https://howtodoinjava.com/spring-core/different-spring-ioc-containers/)

**Spring IoC 容器**是 Spring 框架的核心。 容器将创建对象，将它们连接在一起，进行配置，并管理从创建到销毁的整个生命周期。 Spring 容器使用依赖项注入（DI）来管理组成应用程序的组件。

Spring 在**提供两种类型的容器**。

1.  `BeanFactory`容器
2.  `ApplicationContext`容器

> 阅读更多：[控制反转和依赖注入](https://howtodoinjava.com/spring-core/spring-ioc-vs-di/)

## 1\. `BeanFactory`

[`BeanFactory`](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/beans/factory/BeanFactory.html) 本质上不过是一个高级工厂的接口，该工厂能够维护不同 Bean 及其依赖项的注册表。

`BeanFactory`使我们能够读取 bean 定义并使用 bean 工厂访问它们。

#### 1.1. 如何创建`BeanFactory`

仅使用`BeanFactory`时，我们可以创建一个并以 XML 格式读取一些 bean 定义，如下所示：

`How to Create XmlBeanFactory`

```java
InputStream is = new FileInputStream("beans.xml");
BeanFactory factory = new XmlBeanFactory(is);

//Get bean
HelloWorld obj = (HelloWorld) factory.getBean("helloWorld");

```

创建 bean 工厂的其他方法如下：

`How to Create XmlBeanFactory`

```java
Resource resource = new FileSystemResource("beans.xml");
BeanFactory factory = new XmlBeanFactory(resource);

ClassPathResource resource = new ClassPathResource("beans.xml");
BeanFactory factory = new XmlBeanFactory(resource);

```

基本上就是全部。 使用`getBean(String)`，您可以检索 bean 的实例； `BeanFactory`的客户端视图非常简单。

#### 1.2. `BeanFactory`方法

`BeanFactory`接口只有六个方法可用于调用客户端代码：

1.  `boolean containsBean(String)`：如果`BeanFactory`包含与给定名称匹配的 bean 定义或 bean 实例，则返回`true`
2.  `Object getBean(String)`：返回以给定名称注册的 bean 的实例。 根据`BeanFactory`配置对 bean 的配置方式，将返回单例（因此是共享实例）或新创建的 bean。 如果找不到该 bean（在这种情况下它将是`NoSuchBeanDefinitionException`），或者在实例化和准备该 bean 时发生异常，则会抛出`BeansException`
3.  `Object getBean(String, Class)`：返回以给定名称注册的 bean。 返回的 bean 将被强制转换为给定的`Class`。 如果无法投射 bean，则将引发相应的异常（`BeanNotOfRequiredTypeException`）。 此外，`getBean(String)`方法的所有规则均适用（请参见上文）
4.  `Class getType(String name)`：返回具有给定名称的 bean 的`Class`。 如果找不到与给定名称对应的 bean，将抛出`NoSuchBeanDefinitionException`
5.  `boolean isSingleton(String)`：确定以给定名称注册的 bean 定义或 bean 实例是否为单例。 如果找不到与给定名称相对应的 bean，将抛出`NoSuchBeanDefinitionException`
6.  `String[] getAliases(String)`：返回给定 bean 名称的别名（如果在 bean 定义中定义了别名）

## 2\. `ApplicationContext`

[`ApplicationContext`](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/ApplicationContext.html) 容器添加了更多企业特定的功能，例如从属性文件解析文本消息的功能以及将应用程序事件发布到感兴趣的事件监听器的功能。 该容器由`org.springframework.context.ApplicationContext`接口定义。

`ApplicationContext`容器包含`BeanFactory`容器的所有功能，因此通常建议在`BeanFactory`上使用。 `BeanFactory`仍可用于数据量和速度非常重要的轻量级应用程序，例如移动设备或基于 applet 的应用程序。

#### 2.1. `ApplicationContext`的类型

最常用的`ApplicationContext`实现是：

1.  [`FileSystemXmlApplicationContext`](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/support/FileSystemXmlApplicationContext.html) – 此容器从 XML 文件加载 Bean 的定义。 在这里，您需要向构造函数提供 XML bean 配置文件的完整路径。
2.  [`ClassPathXmlApplicationContext`](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/support/ClassPathXmlApplicationContext.html) – 此容器从 XML 文件加载 Bean 的定义。 在这里，您不需要提供 XML 文件的完整路径，但是需要正确设置 CLASSPATH，因为此容器将在 CLASSPATH 中查找 bean 配置 XML 文件。
3.  [`WebXmlApplicationContext`](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/context/support/XmlWebApplicationContext.html) – 此容器从 Web 应用程序中加载带有所有 bean 定义的 XML 文件。

#### 2.2. 如何创建`ApplicationContext`

用于应用程序上下文实例化的示例代码如下所示。

`How to create ApplicationContext`

```java
ApplicationContext context = new FileSystemXmlApplicationContext("beans.xml");
HelloWorld obj = (HelloWorld) context.getBean("helloWorld");

```

将我的问题放在评论部分。

学习快乐！

参考文献：

[`BeanFactory` Java 文档](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/beans/factory/BeanFactory.html)
[`ApplicationContext` Java 文档](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/ApplicationContext.html)