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

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

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

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

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

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


当前回答

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

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

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

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

其他回答

ApplicationContext是比BeanFactory更可取的方式 在新的Spring版本中,BeanFactory被ApplicationContext取代。但是仍然存在用于向后兼容的BeanFactory ApplicationContext扩展了BeanFactory,并具有以下优点 它支持文本消息的国际化 它支持将事件发布到已注册的侦听器 访问资源,如url和文件

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

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

ApplicationContext是BeanFactory的老大哥,这将是BeanFactory提供的所有东西,还有许多其他的东西。

除了标准的org.springframework.bean .factory. beanfactory生命周期功能外,ApplicationContext实现还可以检测和 调用ApplicationContextAware bean以及ResourceLoaderAware、ApplicationEventPublisherAware和MessageSourceAware bean。

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

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

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