我很新的Spring框架,我一直在玩弄它,并把几样应用程序一起用于评估的Spring MVC对即将到来的公司项目中使用的目的。 到目前为止,我真的很喜欢我在Spring MVC中所看到的,似乎很容易使用,并鼓励你写的是非常单元测试友好类。
只是作为一个练习,我写我的样品/测试项目的一个主要方法。 有一件事我不清楚的是之间的确切差异BeanFactory
和ApplicationContext
-这是适合在哪些条件使用?
我明白ApplicationContext
扩展BeanFactory
,但如果我只是写一个简单的主要方法,我是否需要额外的功能, ApplicationContext
规定? 而就在什么样的额外功能,并ApplicationContext
提供?
除了回答“应该我在main()方法使用”,是否有任何标准或准则,据我应该在这种情况下使用哪种实现? 如果我的main()方法写入取决于豆/应用程序配置是XML格式 - 是一个安全的假设,还是我锁定用户到一些具体的事情?
而且确实在网络环境中,该答案的变化-如果要知道春季我的任何类别的需要,是他们可能更需要ApplicationContext
?
谢谢你的帮助。 我知道有很多这些问题的参考手册中可能回答,但我有一个很难找到这两个接口以及各自的利弊/利弊的明确的细分不读通用细齿梳的手册。
Answer 1:
弹簧的文档在此是伟大的: 3.8.1。 BeanFactory或者ApplicationContext的? 。 他们有一个比较表,我会发布一个片段:
豆厂
应用上下文
- 豆实例/配线
- 自动的BeanPostProcessor注册
- 自动的BeanFactoryPostProcessor注册
- 便捷的MessageSource访问(国际化)
- 出版了ApplicationEvent
所以如果你需要任何提交应用程序上下文侧分的,你应该使用的ApplicationContext。
Answer 2:
对我来说,主要的不同选择BeanFactory
过ApplicationContext
似乎是ApplicationContext
将预先初始化所有的豆类。 从春节文档 :
春天设置属性和解决依赖越晚越好,实际创建时的豆。 这意味着,当你请求一个对象,如果有创建对象或它的一个依赖问题已正确加载Spring容器以后可以产生异常。 例如,bean抛出一个异常作为缺少或非法属性的结果。 这可能耽误了一些配置问题的知名度也是为什么默认实例化预单豆ApplicationContext实现。 在一些前期的时间和内存来创建这些bean是实际需要之前,他们的成本,你会发现配置问题创建ApplicationContext的时候,而不是以后。 你仍然可以覆盖此默认行为,使单豆类将懒惰初始化,而不是预先实例化。
鉴于此,我最初选择BeanFactory
在集成/性能测试使用,因为我不想加载测试中分离豆整个应用程序。 但是-而有人纠正我,如果我错了- BeanFactory
不支持classpath
的XML配置。 所以BeanFactory
和ApplicationContext
每提供一个重要的特征,我想,但也没有两者。
近我可以告诉大家,有关重写默认实例化行为的文档中的说明发生在配置上,它每bean的,所以我不能只是设置了“懒惰初始化”属性的XML文件中或者我坚持维护测试和部署版本的它一个。
我落得这样做扩展什么ClassPathXmlApplicationContext
懒洋洋地加载使用豆类,像这样的测试:
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);
}
}
}
Answer 3:
春天提供两种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
通过完整路径加载豆。 -
ClassPathXmlApplicationContext
通过CLASSPATH加载豆 -
XMLWebApplicationContext
和AnnotationConfigWebApplicationContext
通过Web应用程序上下文加载豆。 -
AnnotationConfigApplicationContext
从基于注解配置加载的Spring bean。
例:
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(BeansConfiguration.class);
-
ApplicationContext
是由初始化容器ContextLoaderListener
或ContextLoaderServlet
在限定web.xml
和ContextLoaderPlugin
中所定义struts-config.xml
。
注 : XmlBeanFactory
被弃用赞成作为春季3.1 DefaultListableBeanFactory
和XmlBeanDefinitionReader
。
Answer 4:
要添加到什么米格尔·平回答,这里是从文档的另一部分 ,回答这个问题,以及:
短版:使用ApplicationContext的,除非你有一个很好的理由不这样做。 对于那些你正在寻找稍微更深度的“但为什么”上述建议的,请继续阅读。
(张贴这为今后的任何春新手谁可能读了这个问题)
Answer 5:
ApplicationContext
比更优选的方式BeanFactory
在新的Spring版本BeanFactory
被替换ApplicationContext
。 但仍然BeanFactory
存在向后兼容性
-
ApplicationContext extends BeanFactory
,并具有以下优点 - 它支持短信国际化
- 它支持事件发布到注册的监听器
- 对资源的访问,如URL和文件
Answer 6:
我认为这是最好经常使用的ApplicationContext,除非你在移动环境中是已被其他人说。 的ApplicationContext更多的功能,你一定要使用的后处理器等RequiredAnnotationBeanPostProcessor,AutowiredAnnotationBeanPostProcessor和CommonAnnotationBeanPostProcessor会,这将帮助您简化Spring配置文件,您可以使用注释,比如@Required,@PostConstruct,@资源,等你的bean中。
即使你不使用所有的东西ApplicationContext的报价,最好还是要用它,再后来,如果你决定使用一些资源的东西,如邮件或后置处理器,或其他架构添加事务建议和这样的,你已经将有一个ApplicationContext,将不需要修改任何代码。
如果你正在写一个独立的应用程序,加载的ApplicationContext在你的主要方法,使用的ClassPathXmlApplicationContext,并得到了主要的bean,并调用它的run()(或其他方式)来启动你的应用程序。 如果你正在编写一个Web应用程序,使用的ContextLoaderListener在web.xml中,以便它创建一个ApplicationContext并且以后可以从ServletContext得到它,无论你使用JSP,JSF,JSTL,支柱,挂毯等。
此外,请记住您可以使用多个配置文件,您可以创建通过列出的所有文件在构造函数(或在的context-param为的ContextLoaderListener列出这些)ApplicationContext时,或者你可以加载具有主配置文件import语句。 您可以通过使用导入Spring配置文件到另一个Spring配置文件<进口来源=“otherfile.xml” />当你编程创建的主要方法ApplicationContext中,仅装入一个Spring配置文件,这是非常有用的。
Answer 7:
ApplicationContext的:它加载在Spring配置文件中配置的Spring bean,并管理的Spring bean的生命周期,当容器STARTS.It不会等到的getBean(“springbeanref”)被调用。
Bean工厂它加载在Spring配置文件中配置Spring bean的,管理的Spring bean的生命周期,当我们调用的getBean(“springbeanref”)。所以当我们调用的getBean在周期开始的Spring bean的生命的时候(“springbeanref”) 。
Answer 8:
在大多数情况下,ApplicationContext的优先,除非你需要节约资源,就像在一个移动应用程序。
我不知道这取决于XML格式,但我敢肯定的ApplicationContext最常见的实现方式是XML的,如与ClassPathXmlApplicationContext,XmlWebApplicationContext和FileSystemXmlApplicationContext来。 这些都是我用过的只有三个。
如果你开发一个Web应用程序,它可以安全地说,你需要使用XmlWebApplicationContext。
如果你希望你的豆子要注意春季的,你可以让他们实现了BeanFactoryAware和/或用于了ApplicationContextAware的是,这样你就可以使用的BeanFactory或者ApplicationContext并选择实现的接口。
Answer 9:
BeanFactory或者ApplicationContext的两个办法从你的Spring IoC容器得豆,但仍存在一定的差异。
Bean工厂是初始化,配置和管理许多bean的实际容器。 这些bean通常会彼此合作,因而它们之间的依赖关系。 这些依赖关系反映在被BeanFactory使用的配置数据。
BeanFactory或者ApplicationContext的都是Java接口和扩展的ApplicationContext Bean工厂。 他们两人都是使用XML配置文件配置。 在短的BeanFactory提供控制(IOC)的基本反转和依赖注入(DI)的功能,同时提供的ApplicationContext 高级功能。
一个BeanFactory由接口“org.springframework.beans.factory”哪里的BeanFactory,对于其中有多个实现方式表示。
ClassPathResource resource = new ClassPathResource("appConfig.xml");
XmlBeanFactory factory = new XmlBeanFactory(resource);
区别
当你调用getBean()方法时,容器开始Bean工厂 bean的实例方法,而ApplicationContext的实例辛格尔顿豆,它不会等待的getBean()被调用。
Bean工厂并没有对国际化提供支持,但ApplicationContext中提供对它的支持。
VS ApplicationContext的 BeanFactory的另一个区别在于发布事件被注册为收听豆能力。
一个流行的实现BeanFactory接口是XmlBeanFactory中 ,而流行的实现ApplicationContext的接口之一是ClassPathXmlApplicationContext的 。
如果您在使用自动布线和使用BeanFactory的比你需要使用API,你可以在XML中,如果您使用的ApplicationContext配置注册AutoWiredBeanPostProcessor。 综上所述Bean工厂是用于测试和非生产用途确定,但ApplicationContext的是功能更丰富容器实现的,应该在Bean工厂受到青睐
默认情况下,它支持延迟加载和ApplicationContext的默认支持Aggresive加载Bean工厂 。
Answer 10:
BeanFactory或者ApplicationContext的区别是以下几点:
- Bean工厂使用延迟初始化,但 ApplicationContext的使用急切初始化。 在BeanFactory中的情况下,当你调用getBeans()方法创建的bean,但在创建ApplicationContext的对象时,豆腐中的ApplicationContext的情况下创建的前期。
- Bean工厂明确提供资源使用对象的语法,但 ApplicationContext中对自己创建和管理资源对象。
- Bean工厂犯规支持internatiolization 但 ApplicationContext中支持国际化。
- 随着Bean工厂基于注解的依赖注入不支持,但基于注释依赖注入在ApplicationContext的支持。
使用Bean工厂:
BeanFactory beanfactory = new XMLBeanFactory(new FileSystemResource("spring.xml")); Triangle triangle =(Triangle)beanFactory.getBean("triangle");
使用的ApplicationContext:
ApplicationContext context = new ClassPathXMLApplicationContext("spring.xml") Triangle triangle =(Triangle)beanFactory.getBean("triangle");
Answer 11:
特点bean工厂的矩阵VS应用程序上下文从春天文档来源
的BeanFacotry和ApplicationContext的功能截图
Answer 12:
基本上,我们可以通过两种方式创建Spring容器对象
- 使用BeatFactory
- 使用的ApplicationContext
两者都是接口
使用实现类,我们可以创建Spring容器对象
来到差异
Bean工厂
不支持基于注解的依赖注入。
不支持国际化
默认情况下,它支持延迟加载
它不允许配置到多个配置文件。
例如:BeanFactory的上下文=新XmlBeanFactory中(新的资源( “applicationContext.xml中”));
的ApplicationContext
支持基于注解的依赖Injection.-@Autowired,@PreDestroy
支持国际化
它在默认情况下支持Aggresive加载。
它允许配置多个配置文件。
例如:
ApplicationContext的上下文=新的ClassPathXmlApplicationContext( “applicationContext.xml中”);
Answer 13:
一个。 bean工厂和应用程序上下文之间的一个区别是,当你调用的getBean()方法,而ApplicationContext的实例辛格尔顿豆当容器启动时,它不会等待的getBean被称为是前者只实例化的bean。
湾
ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
要么
ApplicationContext context = new ClassPathXmlApplicationContext{"spring_dao.xml","spring_service.xml};
您可以根据您的项目需求使用一个或多个XML文件。 正如我在这里使用两个XML文件,即一个详细的配置信息用于其它的DAO类服务类。 这里的ClassPathXmlApplicationContext是ApplicationContext中的孩子。
C。 Bean工厂Container是基本的容器,它只能创建对象和注入依赖。 但是,我们不能附加其他服务,如安全性,事务,消息等提供所有我们使用的ApplicationContext集装箱的服务。
d。 Bean工厂不提供国际化,即国际化支持,但ApplicationContext中提供对它的支持。
即 BeanFactory的容器不支持自动扫描(支持基于注解的依赖注入)的功能,但ApplicationContext的容器支持。
F。 BeanFactory的集装箱不会创建一个bean对象,直到请求时间。 这意味着Bean工厂容器装载豆懒洋洋地。 虽然ApplicationContext的容器中仅载入的时间创建辛格尔顿bean的对象。 这意味着有初装。
G。 BeanFactory的集装箱只支持两个作用域(单例与原型)的豆类。 但是ApplicationContext的容器支持所有的豆类范围。
Answer 14:
请参阅从春文档此文档:
http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/beans.html#context-introduction-ctx-vs-beanfactory
5.15.1 BeanFactory或者ApplicationContext的?
除非你有一个很好的理由不这样做使用一个ApplicationContext。
因为ApplicationContext中包括了BeanFactory所有的功能,所以一般建议在BeanFactory中,除了少数情况下,如一个Applet,其中内存的消耗可能是关键的,并且一些额外的千字节可能会有所作为。 然而,对于大多数典型的企业应用程序和系统,ApplicationContext的是你将要使用的。 Spring 2.0的,后来大量使用了BeanPostProcessor扩展点(实现代理等)。 如果仅使用一个普通的BeanFactory,如交易相当数量的支持,AOP将不会生效,至少在没有你做一些额外的步骤。 因为没有什么实际上是错误的配置,这种情况可能会造成混乱。
Answer 15:
ApplicationContext已Bean工厂的大哥哥,这将是Bean工厂都提供的东西以及许多其他的东西。
除了标准的org.springframework.beans.factory.BeanFactory生命周期的能力,ApplicationContext实现检测,并调用了ApplicationContextAware豆类以及ResourceLoaderAware,ApplicationEventPublisherAware和MessageSourceAware豆。
Answer 16:
在实时情景,是Spring IOC核心容器(Bean工厂)和高级J2EE容器(ApplicationContext的)之间的区别如下。
Bean工厂将建立在spring.xml文件中提及的bean(即用于POJO类)对象( <bean></bean>
),只有当你调用.getBean()方法,但而ApplicationContext中创建的所有对象豆( <bean></bean>
如果其范围没有明确地为“原型”提及)在spring.xml配置在加载spring.xml文件本身。
Bean工厂:(懒惰的容器,因为它创造了豆中的对象,只有当你明确地从用户/主类调用)
/* * Using core Container - Lazy container - Because it creates the bean objects On-Demand */ //creating a resource Resource r = (Resource) new ClassPathResource("com.spring.resources/spring.xml"); //creating BeanFactory BeanFactory factory=new XmlBeanFactory(r); //Getting the bean for the POJO class "HelloWorld.java" HelloWorld worldObj1 = (HelloWorld) factory.getBean("test");
ApplicationContext的:(因为在加载spring.xml文件本身创建所有的singleton bean的对象的渴望容器)
ApplicationContext context = new ClassPathXmlApplicationContext("com/ioc/constructorDI/resources/spring.xml");
从技术上讲,使用的ApplicationContext在实时应用,因为推荐的,而应用程序是在服务器本身入门将要创建的bean对象。 这减少了响应时间作为对象已经提供给响应所述用户请求。
Answer 17:
我认为这是值得一提的是,由于春季3,如果你想创建一个工厂,你也可以使用@configuration
注释与适当的结合@scope
@Configuration
public class MyFactory {
@Bean
@Scope("prototype")
public MyClass create() {
return new MyClass();
}
}
你的工厂应使用由Spring容器可见@ComponentScan
注释或xml配置
从baeldung网站的Spring bean作用域文章
Answer 18:
因为它仅支持单例和原型豆范围不使用BeanFactory的非Web应用程序。
虽然ApplicationContext的容器不支持所有的豆范围,所以你应该使用它的Web应用程序。
Answer 19:
综上所述:
ApplicationContext的包括BeanFactory所有的功能。 通常建议使用前者。
有一些有限的情况下,如移动应用程序,其中内存的消耗可能是至关重要的。
在这种情况下,它可以合理使用更轻便的BeanFactory。 然而,在大多数企业应用,ApplicationContext的是你将要使用的。
如需更多信息,请参见我的博客文章:
在Spring的BeanFactory和ApplicationContext的区别-从最基础的Java的春天博客
文章来源: BeanFactory vs ApplicationContext