包目录不同
BeanFactory:spring-beans.jar 中 org.springframework.beans.factory.BeanFactory
ApplicationContext:spring-context.jar 中 org.springframework.context.ApplicationContext
国际化
由于 ApplicationContext 实现了 MessageResource 接口,因而具有消息处理的能力
BeanFactory 没有实现 Spring 中MessageResource接口,因此BeanFactory 是不支持国际化功能的
强大的事件机制
基本上牵涉到事件(Event)方面的设计,就离不开观察者模式
ApplicationContext 的事件机制主要通过 ApplicationEvent 和 ApplicationListener这两个接口来提供的,即当 ApplicationContext 中发布一个事件时,所有扩展ApplicationListener 的 Bean 都将接受到这个事件,并进行相应的处理。
底层资源的访问
ApplicationContext 扩展了 ResourceLoader(资源加载器)接口,从而可以用来加载多个Resource,而BeanFactory 是没有扩展 ResourceLoader
创建的方式不同
BeanFactory 通常以编程的方式被创建
ApplicationContext 能以声明的方式创建
延迟加载
(1)实例化的时间不同
BeanFactroy 采用的是延迟加载形式来注入 Bean 的,即只有在使用到某个 Bean 时(调用getBean()),才对该 Bean 进行加载实例化。这样,我们就不能发现一些存在的 spring 的配置问题
ApplicationContext 则相反,它是在容器启动时,一次性创建了所有的 Bean。这样,在容器启动时,我们就可以发现Spring 中存在的配置错误
(2)对BeanPostProcessor和BeanFactoryPostProcessor的支持
BeanFactory 和 ApplicationContext 都支持 BeanPostProcessor、BeanFactoryPostProcessor 的使用。
两者之间的区别是:BeanFactory 需要手动注册,而ApplicationContext 则是自动注册。
常用的容器
(1)ApplicationContext 类型的常用容器
ClassPathXmlApplicationContext
从 ClassPath 的 XML 配置文件中读取上下文,并生成上下文定义。应用程序上下文从程序环境变量中取得。
FileSystemXmlApplicationContext
从文件系统中的 XML 配置文件读取上下文。
XmlWebApplicationContext
从 Web 应用的 XML 文件读取上下文。例如我们在 Spring MVC使用的情况。
(2)BeanFactory 类型的常用容器
XmlBeanFactory
BeanFactory 类型的有 XmlBeanFactory,它可以根据 XML 文件中定义的内容,创建相应的Bean
总结
BeanFactory 是 Spring 框架的基础设施,面向 Spring 本身
ApplicationContext 面向使用Spring 的开发者,相比于 BeanFactory,
ApplicationContext提供了更多面向实际开发的功能,几乎所有场合都可以直接使用
ApplicationContext,而不是底层的 BeanFactory。