我对这两个概念有点困惑。阅读Spring文档,我发现例如bean factories是Spring容器。我还读到“ApplicationContext是BeanFactory的完整超集”。但是这两者之间的区别并不明显。那么它们之间有什么区别呢?
我有些困惑这两个概念。在阅读Spring文档时,我了解到bean factories是Spring容器,同时也读到“ApplicationContext是BeanFactory的全面超集”。但是,它们之间的区别不是很明显。那么,这两者有什么区别呢?
我对这两个概念有点困惑。阅读Spring文档,我发现例如bean factories是Spring容器。我还读到“ApplicationContext是BeanFactory的完整超集”。但是这两者之间的区别并不明显。那么它们之间有什么区别呢?
我有些困惑这两个概念。在阅读Spring文档时,我了解到bean factories是Spring容器,同时也读到“ApplicationContext是BeanFactory的全面超集”。但是,它们之间的区别不是很明显。那么,这两者有什么区别呢?
这篇文章的链接来自Ajinkya分享的stackoverflow问题,里面的答案非常全面,但我想引用另一份资料——Spring in Action(Manning Publications)中的一些好点子:
在一个基于Spring的应用程序中,您的应用程序对象将存在于Spring容器中。如图2.1所示,容器将创建对象、将它们连接在一起、配置它们,并从开始到结束管理它们的整个生命周期(或者说从"new"到"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,在调用 getBean() 方法时才创建 Bean。应用程序上下文更加智能,会在启动时预加载所有单例 Bean。通过预加载单例 Bean,您可以确保它们在需要时已准备好使用——您的应用程序无需等待它们被创建。
应用程序上下文是IoC容器的一种实现。
org.springframework.beans和org.springframework.context包是Spring Framework的IoC容器的基础。BeanFactory接口提供了一个高级配置机制,能够管理任何类型的对象。ApplicationContext是BeanFactory的子接口。它增加了更容易与Spring的AOP特性集成;消息资源处理(用于国际化);事件发布以及应用程序层特定的上下文,例如WebApplicationContext,用于Web应用程序。
简而言之,BeanFactory提供了配置框架和基本功能,而ApplicationContext添加了更多企业特定的功能。ApplicationContext是BeanFactory的完整超集,并且在描述Spring的IoC容器时仅在本章中使用。
更多详细信息可以在这里找到。