文章来源
https://www.zhihu.com/question/38597460?sort=created
https://blog.csdn.net/u011202334/article/details/51509235
https://blog.csdn.net/hi_kevin/article/details/7325554
一 第一种说法
Spring中的BeanFactory和ApplicationContext相比,提供了更多的扩展功能,但是这还不是主要的区别,主要区别在于BeanFactory是延迟加载,举个例子:如果Bean没有完全注入,BeanFactory加载后,会在你第一次调用getBean方法时才会抛出异常;而ApplicationContext会在初始化的时候就加载并且检查,这样的好处是可以及时检查依赖是否完全注入;所以通常来说我们会选择使用ApplicationContext.
BeanFactory和ApplicationContext都支持BeanPostProcessor\BeanFactoryPostProcessor的使用,但是两者之间的区别在于:BeanFactory需要手动注册,而ApplicationContext则是自动注册的.
BeanFactory是Spring中相当古老的Factory了,比如说XmlBeanFactory就是一种相当电影的BeanFactory.所以原始的BeanFactory就无法支持诸如AOP\WEB应用等许多插件
ApplicationContext接口是有BeanFactory接口派生出来的,所以提供了BeanFactory的所有功能.ApplicationContext是一种更加面向框架的工作方式以及对上下文进行分层和实现继承.并且ApplicationContext还额外提供了一下功能.
- MessageSource:提供国际化的消息访问
- 资源访问:如URL和文件
- 事件传播
- 载入多个(有继承关系)上下文,使得每一个上下文都专注于一个特定的层次,比如应用的web层
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).
2.强大的事件机制(Event)
基本上牵涉到事件(Event)方面的设计,就离不开观察者模式。不明白观察者模式的朋友,最好上网了解下。因为,这种模式在java开发中是比较常用的,又是比较重要的。 ApplicationContext的事件机制主要通过ApplicationEvent和ApplicationListener这两个接口来提供的,和java swing中的事件机制一样。即当ApplicationContext中发布一个事件的时,所有扩展了ApplicationListener的Bean都将会接受到这个事件