首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BeanFactory vs ApplicationContext

BeanFactory vs ApplicationContext
EN

Stack Overflow用户
提问于 2008-10-28 13:50:19
回答 19查看 280.5K关注 0票数 259

我对Spring框架非常陌生,我一直在尝试使用它,并将一些示例应用程序放在一起,以便评估Spring MVC在即将到来的公司项目中的使用情况。到目前为止,我真的很喜欢我在Spring MVC中看到的东西,看起来非常容易使用,并鼓励您编写对单元测试非常友好的类。

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

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

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

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

谢谢你的帮助。我知道很多这样的问题可能已经在参考手册中得到了回答,但我很难找到这两个界面的清晰分类,以及每个界面的优缺点,而不是仔细地阅读手册。

EN

回答 19

Stack Overflow用户

回答已采纳

发布于 2008-10-28 14:04:38

spring文档在这一点上做得很好:3.8.1. BeanFactory or ApplicationContext?。他们有一个带有比较的表格,我将发布一个代码片段:

Bean工厂

  • Bean instantiation/wiring

应用程序上下文

instantiation/wiring

  • Automatic registration

  • Automatic registration

  • Convenient i18n)

  • ApplicationEvent access
  • Bean BeanPostProcessor BeanFactoryPostProcessor MessageSource access(适用于i18n)
  • ApplicationEvent publication

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

票数 224
EN

Stack Overflow用户

发布于 2010-02-28 11:04:01

对我来说,选择BeanFactory而不是ApplicationContext的主要区别似乎是ApplicationContext将预先实例化所有bean。来自the docs

在实际创建

时,bean Spring会设置属性并尽可能晚地解析依赖项。这意味着,如果在创建对象或其依赖项时出现问题,正确加载的Spring容器稍后可能会在您请求对象时生成异常。例如,由于缺少属性或属性无效,bean将抛出异常。这可能会延迟某些配置问题的可见性,这就是为什么ApplicationContext实现默认预先实例化单例bean的原因。在实际需要这些bean之前创建它们会耗费一些前期时间和内存,您会在创建ApplicationContext时发现配置问题。您仍然可以覆盖此默认行为,以便单例bean将延迟初始化,而不是预先实例化。

考虑到这一点,我最初选择BeanFactory用于集成/性能测试,因为我不想加载整个应用程序来测试独立的bean。但是--如果我错了,有人纠正我-- BeanFactory不支持classpath XML配置。因此,BeanFactoryApplicationContext各自提供了我想要的关键特性,但两者都没有。

据我所知,文档中关于覆盖默认实例化行为的说明发生在配置中,而且是针对每个bean的,所以我不能在XML文件中设置"lazy-init“属性,否则我不得不维护它的一个版本用于测试,另一个版本用于部署。

我最终做的是扩展ClassPathXmlApplicationContext,以便延迟加载beans,以便在这样的测试中使用:

代码语言:javascript
复制
public class LazyLoadingXmlApplicationContext extends ClassPathXmlApplicationContext {

    public LazyLoadingXmlApplicationContext(String[] configLocations) {
        super(configLocations);
    }

    /**
     * Upon loading bean definitions, force beans to be lazy-initialized.
     * @see org.springframework.context.support.AbstractXmlApplicationContext#loadBeanDefinitions(org.springframework.beans.factory.xml.XmlBeanDefinitionReader)
     */

    @Override
    protected void loadBeanDefinitions(XmlBeanDefinitionReader reader) throws IOException {
        super.loadBeanDefinitions(reader);
        for (String name: reader.getBeanFactory().getBeanDefinitionNames()) {
            AbstractBeanDefinition beanDefinition = (AbstractBeanDefinition) reader.getBeanFactory().getBeanDefinition(name);
            beanDefinition.setLazyInit(true);
        }
    }

}
票数 49
EN

Stack Overflow用户

发布于 2008-10-28 14:08:24

为了补充米格尔·平的回答,这里有一个another section from the documentation也回答了这个问题:

简短版本:使用ApplicationContext,除非你有很好的理由不这么做。对于那些正在寻找更多关于上述建议的“但为什么”的深度的人,请继续阅读。

(把这篇文章发布给任何可能读到这个问题的未来Spring新手)

票数 33
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/243385

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档