概述
首先解释一下两个名词:
BeanFactory
是 Bean 工厂。ApplicationContext
是应用上下文。
ApplicationContext
和 BeanFactory
都是装载 Bean
的容器, 且 ApplicationContext
继承自 BeanFactory
。但 ApplicationContext
较 BeanFactory
来说更高级一点。
主要区别: 是否延迟加载
BeanFactory 是采用延迟加载的形式来注入 Bean 的, 即只有在用到某个 Bean 时才会去加载它。而 ApplicationContext 会在容器启动时就创建了所有的 Bean 。
但是个人认为在是否懒加载这一点上并没有谁比谁更好的说法。
- 延迟加载可以避免出现内存泄漏的情况。
- 非延迟加载可以在应用启动时检查到可能存在的错误, 提供运行时的容错率。
ApplicationContext 拥有其他的高级功能
BeanFactory
是比较原始的 Bean
容器, 不支持下列(包括但不限于)许多高级功能:
- 消息国际化 :
BeanFactory
不支持消息国际化功能, 因为BeanFactory
没有扩展MessageResource
接口。 - 事件机制 :
ApplicationContext
实现了ApplicationEventPublisher
, 可以实现事件监听机制。 - 底层资源访问 :
ApplicationContext
实现了ResourceLoader
接口, 可以用来加载底层资源。 - 对 Web 应用的支持