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

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

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

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

这个答案在web环境中会改变吗——如果我的任何类需要了解Spring,它们更可能需要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”);

其他回答

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

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

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范围。

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

Bean工厂

Bean实例化/布线

应用程序上下文

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

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

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

@Configuration
public class MyFactory {

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

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

春豆范围文章从贝龙网站

BeanFactory和ApplicationContext都是从spring IOC容器中获取bean的方法,但仍有一些区别。

BeanFactory是实例化、配置和管理许多bean的实际容器。这些bean通常彼此协作,因此它们之间存在依赖关系。这些依赖关系反映在BeanFactory使用的配置数据中。

BeanFactory和ApplicationContext都是Java接口,而ApplicationContext扩展了BeanFactory。它们都是使用XML配置文件进行配置的。简而言之,BeanFactory提供了基本的控制反转(IoC)和依赖注入(DI)特性,而ApplicationContext提供了高级特性。

BeanFactory由接口“org.springframework.beans”表示。其中BeanFactory有多个实现。

ClassPathResource resource = new ClassPathResource("appConfig.xml");
XmlBeanFactory factory = new XmlBeanFactory(resource);

区别

BeanFactory instantiate bean when you call getBean() method while ApplicationContext instantiate Singleton bean when container is started, It doesn't wait for getBean() to be called. BeanFactory doesn't provide support for internationalization but ApplicationContext provides support for it. Another difference between BeanFactory vs ApplicationContext is ability to publish event to beans that are registered as listener. One of the popular implementation of BeanFactory interface is XMLBeanFactory while one of the popular implementation of ApplicationContext interface is ClassPathXmlApplicationContext. If you are using auto wiring and using BeanFactory than you need to register AutoWiredBeanPostProcessor using API which you can configure in XML if you are using ApplicationContext. In summary BeanFactory is OK for testing and non production use but ApplicationContext is more feature rich container implementation and should be favored over BeanFactory BeanFactory by default its support Lazy loading and ApplicationContext by default support Aggresive loading.