我是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,除非需要节省资源,比如在移动应用程序上。
我不确定是否依赖于XML格式,但我非常确定ApplicationContext最常见的实现是XML实现,例如ClassPathXmlApplicationContext、XmlWebApplicationContext和FileSystemXmlApplicationContext。我只用过这三个。
如果您正在开发web应用程序,可以肯定地说,您将需要使用XmlWebApplicationContext。
如果您希望bean能够感知Spring,您可以让它们为此实现BeanFactoryAware和/或ApplicationContextAware,因此您可以使用BeanFactory或ApplicationContext并选择实现哪个接口。
Spring提供两种IOC容器,一种是XMLBeanFactory,另一种是ApplicationContext。
|
BeanFactory |
ApplicationContext |
Annotation support |
No |
Yes |
BeanPostProcessor Registration |
Manual |
Automatic |
Implementation |
XMLBeanFactory |
ClassPath/FileSystem/WebXmlApplicationContext |
Internationalization |
No |
Yes |
Enterprise services |
No |
Yes |
ApplicationEvent publication |
No |
Yes |
通过完整路径加载的FileSystemXmlApplicationContext bean。
通过CLASSPATH加载的bean
XMLWebApplicationContext和AnnotationConfigWebApplicationContext bean通过web应用程序上下文加载。
从基于Annotation的配置中加载Spring bean。
例子:
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(BeansConfiguration.class);
ApplicationContext是由web.xml中定义的ContextLoaderListener或ContextLoaderServlet和struts-config.xml中定义的ContextLoaderPlugin初始化的容器。
注意:XmlBeanFactory从Spring 3.1开始已弃用,取而代之的是DefaultListableBeanFactory和XmlBeanDefinitionReader。
参考Spring Docs中的这个文档:
http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/beans.html#context-introduction-ctx-vs-beanfactory
5.15.1 bean工厂还是应用上下文?
使用ApplicationContext,除非你有很好的理由不这样做。
Because the ApplicationContext includes all functionality of the BeanFactory, it is generally recommended over the BeanFactory, except for a few situations such as in an Applet where memory consumption might be critical and a few extra kilobytes might make a difference. However, for most typical enterprise applications and systems, the ApplicationContext is what you will want to use. Spring 2.0 and later makes heavy use of the BeanPostProcessor extension point (to effect proxying and so on). If you use only a plain BeanFactory, a fair amount of support such as transactions and AOP will not take effect, at least not without some extra steps on your part. This situation could be confusing because nothing is actually wrong with the configuration.