23

我对这两个概念有点困惑。阅读 Spring 文档,我发现,例如。bean 工厂是 Spring 容器。我还读到“ApplicationContext 是 BeanFactory 的完整超集”。但两者之间的区别并不明显。那么区别是什么呢?

4

3 回答 3

29

Ajinkya 附加的这个链接的答案非常全面,但是,我想参考另一种材料的一些优点 - Spring in Action (Manning Publications):

在基于 Spring 的应用程序中,您的应用程序对象将存在于 Spring 容器中。如图 2.1 所示,容器将创建对象,将它们连接在一起,配置它们,并管理它们从摇篮到坟墓的完整生命周期(或新到 finalize(),视情况而定)。

在此处输入图像描述

没有单个 Spring 容器。Spring 附带了几个容器实现,可以分为两种不同的类型。Bean 工厂(由 org.springframework.beans.factory.BeanFactory 接口定义)是最简单的容器,为 DI 提供基本支持。应用程序上下文(由 org.springframework.context.ApplicationContext 接口定义)通过提供应用程序框架服务构建在 bean 工厂的概念之上,例如从属性文件解析文本消息的能力以及将应用程序事件发布给感兴趣的能力事件监听器。

从表面上看,ApplicationContext 与 BeanFactory 非常相似。两者都加载 bean 定义,将 bean 连接在一起,并根据请求分配 bean。但是 ApplicationContext 提供了更多:

  • 应用程序上下文提供了一种解析文本消息的方法,包括对这些消息的国际化 (I18N) 的支持。
  • 应用程序上下文提供了一种加载文件资源(例如图像)的通用方式。
  • 应用程序上下文可以将事件发布到注册为侦听器的 bean。

由于它提供的附加功能,在几乎所有应用程序中,ApplicationContext 都优于 BeanFactory。您可能会考虑使用 BeanFactory 的唯一情况是在资源稀缺的情况下,例如移动设备。

除了应用程序上下文提供的附加功能外,应用程序上下文和 bean 工厂之间的另一个重大区别是单例 bean 的加载方式。bean 工厂延迟加载所有 bean,延迟 bean 创建直到调用 getBean() 方法。应用程序上下文更智能一些,它会在上下文启动时预加载所有单例 bean。通过预加载单例 bean,您可以确保它们在需要时可以使用——您的应用程序不必等待它们被创建。

于 2012-04-25T03:39:06.567 回答
5

应用程序上下文是 IoC 容器的实现。

于 2019-02-08T07:35:14.983 回答
0

org.springframework.beans 和 org.springframework.context 包是 Spring Framework 的 IoC 容器的基础。BeanFactory 接口提供了一种高级配置机制,能够管理任何类型的对象。ApplicationContext 是 BeanFactory 的子接口。它增加了与 Spring 的 AOP 特性的更容易集成;消息资源处理(用于国际化)、事件发布;和应用程序层特定的上下文,例如用于 Web 应用程序的 WebApplicationContext。

简而言之,BeanFactory 提供了配置框架和基本功能,ApplicationContext 增加了更多的企业特定功能。ApplicationContext 是 BeanFactory 的完整超集,在本章中专门用于描述 Spring 的 IoC 容器。

更多细节可以在这里找到

于 2021-03-14T15:59:24.100 回答