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

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

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

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

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

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


当前回答

ApplicationContext: 它加载spring配置文件中配置的spring bean,并在CONTAINER启动时管理spring bean的生命周期。它不会等到getBean("springbeanref")被调用。

BeanFactory 它加载spring配置文件中配置的springbean,在调用getBean("springbeanref")时管理springbean的生命周期。因此,当我们在springbean生命周期开始时调用getBean(“springbeanref”)时。

其他回答

我认为最好总是使用ApplicationContext,除非您像其他人所说的那样处于移动环境中。ApplicationContext有更多的功能,你肯定想使用postprocessor,比如RequiredAnnotationBeanPostProcessor, AutowiredAnnotationBeanPostProcessor和CommonAnnotationBeanPostProcessor,这将帮助你简化你的Spring配置文件,你可以在你的bean中使用@Required, @PostConstruct, @Resource等注释。

即使您不使用ApplicationContext提供的所有东西,最好还是使用它,然后如果您决定使用一些资源东西,如消息或post处理器,或其他模式来添加事务通知等,您将已经拥有一个ApplicationContext,而不需要更改任何代码。

如果你在写一个独立的应用程序,加载ApplicationContext在主方法中,使用ClassPathXmlApplicationContext,并得到主豆和调用它的运行()(或其他方法)来启动应用程序。如果您正在编写一个web应用程序,使用web . xml中的ContextLoaderListener,创造了从ServletContext ApplicationContext你稍后可以得到它,无论你使用JSP时,JSF, JSTL, struts,挂毯等。

Also, remember you can use multiple Spring configuration files and you can either create the ApplicationContext by listing all the files in the constructor (or listing them in the context-param for the ContextLoaderListener), or you can just load a main config file which has import statements. You can import a Spring configuration file into another Spring configuration file by using <import resource="otherfile.xml" /> which is very useful when you programmatically create the ApplicationContext in the main method and load only one Spring config file.

spring文档在这方面做得很好:3.8.1。BeanFactory还是ApplicationContext? 他们有一个比较表,我将发布一个片段:

Bean工厂

Bean实例化/布线

应用程序上下文

Bean实例化/布线 自动BeanPostProcessor注册 自动BeanFactoryPostProcessor注册 方便的MessageSource访问(用于i18n) ApplicationEvent出版

因此,如果您需要应用程序上下文端显示的任何点,您应该使用ApplicationContext。

基本上我们可以用两种方式创建spring容器对象

使用BeanFactory。 使用ApplicationContext。

都是界面,

使用实现类,我们可以为spring容器创建对象

来看看区别

BeanFactory:

不支持基于注释的依赖注入。 不支持I18N。 默认情况下,它支持惰性加载。 它不允许配置到多个配置文件。

例如:BeanFactory context=new XmlBeanFactory(new Resource(“applicationContext.xml”));

ApplicationContext

支持基于注释的依赖注入。@ autowired, @PreDestroy I18N支持 它默认支持侵略性加载。 它允许配置多个配置文件。

前任: ApplicationContext context=new ClasspathXmlApplicationContext(“applicationContext.xml”);

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

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

Bean工厂的特性矩阵vs来自spring文档的应用程序上下文

beanfactory和ApplicationContext功能的截图