我是Spring框架的新手,我一直在摆弄它,并把一些样本应用放在一起,目的是评估Spring MVC在即将到来的公司项目中的使用。到目前为止,我真的很喜欢Spring MVC,它看起来很容易使用,并鼓励你编写对单元测试非常友好的类。

作为练习,我正在为我的一个示例/测试项目编写一个主方法。我不清楚的一件事是BeanFactory和ApplicationContext之间的确切区别——哪个适合在哪些条件下使用?

我知道ApplicationContext扩展了BeanFactory,但是如果我只是编写一个简单的主方法,我是否需要ApplicationContext提供的额外功能呢?ApplicationContext究竟提供了什么样的额外功能?

除了回答“我应该在main()方法中使用哪个”之外,关于在这样的场景中应该使用哪个实现,是否有任何标准或指南?我的main()方法是否应该被编写成依赖于bean/应用程序配置的XML格式——这是一个安全的假设吗,还是我将用户锁定到某个特定的东西?

这个答案在web环境中会改变吗——如果我的任何类需要了解Spring,它们更可能需要ApplicationContext吗?

谢谢你的帮助。我知道很多问题都可以在参考手册中找到答案,但如果没有仔细阅读手册,我很难找到这两个接口的清晰分解以及各自的优缺点。


当前回答

总而言之:

ApplicationContext包括BeanFactory的所有功能。 一般建议使用前者。

在一些有限的情况下,例如在移动应用程序中,内存消耗可能是关键的。

在这种情况下,使用更轻量级的BeanFactory是合理的。然而,在大多数企业应用程序中,ApplicationContext是您想要使用的。

要了解更多,请参阅我的博客文章:

Spring中的BeanFactory和ApplicationContext的区别——java Spring博客的基础

其他回答

为了补充Miguel Ping回答的问题,这里是文档中的另一个部分,也回答了这个问题:

简短的版本:使用ApplicationContext,除非你有很好的理由不这样做。对于那些想要更深入地了解上述建议的“但是为什么”的人,请继续阅读。

(将这篇文章发布给未来可能会读到这个问题的春季新手)

在非web应用程序中使用BeanFactory,因为它只支持单例和原型bean作用域。

而ApplicationContext容器确实支持所有的bean作用域,所以你应该将它用于web应用程序。

在大多数情况下,首选ApplicationContext,除非需要节省资源,比如在移动应用程序上。

我不确定是否依赖于XML格式,但我非常确定ApplicationContext最常见的实现是XML实现,例如ClassPathXmlApplicationContext、XmlWebApplicationContext和FileSystemXmlApplicationContext。我只用过这三个。

如果您正在开发web应用程序,可以肯定地说,您将需要使用XmlWebApplicationContext。

如果您希望bean能够感知Spring,您可以让它们为此实现BeanFactoryAware和/或ApplicationContextAware,因此您可以使用BeanFactory或ApplicationContext并选择实现哪个接口。

我需要解释BeanFactory & ApplicationContext。

BeanFactory: BeanFactory is root interface for accessing the SpringBean Container.There is basic client view of a bean container. That interface is implemented by the object class that holds the number of beans definitions, and each uniquely identify by the String name Depending the Bean definition the factory will return the instance that instance may be the instance of contained object or a single shared instance. Which type of instance will be return depends of bean factory configuration. Normally Bean factory will load the all the all the beans definition, which stored in the configuration source like XML...etc.

BeanFactory是一个为依赖注入提供基本支持的最简单的容器

应用程序上下文 应用程序上下文是spring应用程序中的一个中心接口,它向应用程序提供配置信息。它实现了Bean工厂接口。

应用程序上下文是一个高级容器,它增加了高级级别的企业特定功能,例如从属性文件....解析文本消息的能力等

一个ApplicationContext提供:

Bean factory methods for accessing application components. Inherited from ListableBeanFactory. The ability to load file resources in a generic fashion. Inherited from the ResourceLoader interface. The ability to publish events to registered listeners. Inherited from the ApplicationEventPublisher interface. The ability to resolve messages, supporting internationalization. Inherited from the MessageSource interface. Inheritance from a parent context. Definitions in a descendant context will always take priority. This means, for example, that a single parent context can be used by an entire web application, while each servlet has its own child context that is independent of that of any other servlet. In addition to standard BeanFactory lifecycle capabilities, ApplicationContext implementations detect and invoke ApplicationContextAware beans as well as ResourceLoaderAware, ApplicationEventPublisherAware and MessageSourceAware beans.

我的六分钱:

BeanFactory and ApplicationContext both are interfaces where ApplicationContext extends BeanFactory. So ApplicationContext is a child interface and BeanFactory is the parent interface. In other words, ApplicationContext has all the features of BeanFactory and it has some additional features that are not present in BeanFactory. BeanFactory loads beans on-demand that is Lazy Loading whereas ApplicationContext loads all beans at startup that is Eager Loading. BeanFactory does not support annotations whereas ApplicationContext supports annotations. ApplicationContext has additional features that are not present in BeanFactory: Internationalization, Event Publishing, AOP features. BeanFactory only supports two scopes — Singleton and Prototype whereas ApplicationContext supports all bean scopes. BeanFactory does not register BeanFactoryPostProcessor and BeanPostProcessor automatically whereas ApplicationContext automatically registers them.