BeanFacotry是spring中比较原始的Factory。如XMLBeanFactory就是一种典型的BeanFactory。原始的BeanFactory没法支持spring的许多插件,如AOP功能、Web应用等。
ApplicationContext接口,它由BeanFactory接口派生而来,于是提供BeanFactory全部的功能。ApplicationContext以一种更向面向框架的方式工做以及对上下文进行分层和实现继承,ApplicationContext包还提供了如下的功能:
• MessageSource, 提供国际化的消息访问
• 资源访问,如URL和文件
• 事件传播
• 载入多个(有继承关系)上下文 ,使得每个上下文都专一于一个特定的层次,好比应用的web层
1.利用MessageSource进行国际化
BeanFactory是不支持国际化功能的,由于BeanFactory没有扩展Spring中MessageResource接口。相反,因为ApplicationContext扩展了MessageResource接口,于是具备消息处理的能力(i18N),具体spring如何使用国际化,之后章节会详细描述。
2.强大的事件机制(Event)
基本上牵涉到事件(Event)方面的设计,就离不开观察者模式。不明白观察者模式的朋友,最好上网了解下。由于,这种模式在java开发中是比较经常使用的,又是比较重要的。
ApplicationContext的事件机制主要经过ApplicationEvent和ApplicationListener这两个接口来提供的,和java swing中的事件机制同样。即当ApplicationContext中发布一个事件的时,全部扩展了ApplicationListener的Bean都将会接受到这个事件,并进行相应的处理。
Spring提供了部份内置事件,主要有如下几种:
ContextRefreshedEvent :ApplicationContext发送该事件时,表示该容器中全部的Bean都已经被装载完成,此ApplicationContext已就绪可用
ContextStartedEvent:生命周期 beans的启动信号
ContextStoppedEvent: 生命周期 beans的中止信号
ContextClosedEvent:ApplicationContext关闭事件,则context不能刷新和重启,从而全部的singleton bean所有销毁(由于singleton bean是存在容器缓存中的)
虽然,spring提供了许多内置事件,但用户也可根据本身须要来扩展spriong中的事物。注意,要扩展的事件都要实现ApplicationEvent接口。
3.底层资源的访问
ApplicationContext扩展了ResourceLoader(资源加载器)接口,从而能够用来加载多个Resource,而BeanFactory是没有扩展ResourceLoader
4.对Web应用的支持
与BeanFactory一般以编程的方式被建立不一样的是,ApplicationContext能以声明的方式建立,如使用ContextLoader。固然你也可使用ApplicationContext的实现之一来以编程的方式建立ApplicationContext实例 。
5.其它区别
1).BeanFactroy采用的是延迟加载形式来注入Bean的,即只有在使用到某个Bean时(调用getBean()),才对该Bean进行加载实例化,这样,咱们就不能发现一些存在的Spring的配置问题。而ApplicationContext则相反,它是在容器启动时,一次性建立了全部的Bean。这样,在容器启动时,咱们就能够发现Spring中存在的配置错误。
2).BeanFactory和ApplicationContext都支持BeanPostProcessor、BeanFactoryPostProcessor的使用,但二者之间的区别是:BeanFactory须要手动注册,而ApplicationContext则是自动注册