我是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博客的基础

其他回答

总而言之:

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

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

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

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

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

a. bean工厂和应用程序上下文之间的一个区别是前者只在调用getBean()方法时实例化bean,而ApplicationContext在容器启动时实例化单例bean,它不等待getBean被调用。

b。

ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");

or

ApplicationContext context = new ClassPathXmlApplicationContext{"spring_dao.xml","spring_service.xml};

您可以根据项目需求使用一个或多个xml文件。我在这里使用了两个xml文件,即一个用于服务类的配置细节,另一个用于dao类。这里ClassPathXmlApplicationContext是ApplicationContext的子。

c. BeanFactory Container是基本容器,它只能创建对象和注入依赖项。但我们不能附加其他服务,如安全、事务、消息等,以提供我们必须使用ApplicationContext容器的所有服务。

d. BeanFactory不提供国际化支持,即i18n,但ApplicationContext提供了国际化支持。

e. BeanFactory容器不支持自动扫描(支持基于注释的依赖注入)特性,但ApplicationContext容器支持。

f.直到请求时间,Beanfactory容器才会创建bean对象。这意味着Beanfactory容器会懒惰地装载bean。而ApplicationContext容器只在加载时创建单例bean的对象。这意味着有早期装载。

Beanfactory容器只支持bean的两个作用域(单例和原型)。但是ApplicationContext容器支持所有的bean范围。

BeanFactory指的是在运行时调用getBean()方法后延迟实例化bean对象的spring容器。

ApplicationContext指的是spring框架,它在部署期间主动实例化bean对象,而不在运行时调用getBean()方法。

我认为值得一提的是,从Spring 3开始,如果您想创建一个工厂,您还可以使用@configuration注释结合适当的@scope

@Configuration
public class MyFactory {

    @Bean
    @Scope("prototype")
    public MyClass create() {
        return new MyClass();
    }
}

使用@ComponentScan注释或xml配置,Spring容器应该可以看到您的工厂

春豆范围文章从贝龙网站

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

Bean工厂

Bean实例化/布线

应用程序上下文

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

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