1. 简述三者关系
在Spring官方文档中,有一段话描述了三者的关系:
org.springframework.beans
和org.springframework.context
包是Spring Framework IoC容器的基础。
BeanFactory接口提供了一种高级配置机制,能够管理任何类型的对象。ApplicationContext是BeanFactory的子接口,在原有功能基础上它增加了:Spring AOP功能的更简易集成、消息资源处理(用于国际化)、事件发布、应用层特定上下文(如用于网络应用的 WebApplicationContext)。
在Spring中,构成应用程序主干并由Spring IoC容器管理的对象称为Bean。Bean是由Spring IoC容器实例化、组装和管理的对象。Bean只是应用程序中的众多对象之一。Bean以及它们之间的依赖关系反映在容器使用的配置元数据中。
这一段话看完,你可能还是很疑惑,耐心接着看下去,看完后面的文章你会发现这一段描述是真的很精辟!
其它Spring源码文章:
Bean的扫描、装配和注册
Bean后处理器的注册与执行——BeanPostProcessor(BPP)
BeanFactory后处理器的注册与执行——BeanFactoryPostProcessor(BFPP)
8个你需要了解的Spring Bean扩展,让你在设计代码时更加优雅(实战总结篇)
2. IoC容器与Bean对象
Spring IoC框架围绕两个主体展开:Bean、BeanFactory。ApplicationContext则是BeanFactory的扩展,两者都可以代表Spring的IoC容器。那么IoC容器与Bean对象的关系是怎么样的呢?官网Container篇有这么几段描述:
当ApplicationContext作为IoC容器时,与BeanFactory一样,拥有实例化、配置和装配 Bean的功能。
在一个完整的Spring程序中,IoC容器将结合配置元数据(configuration metadata)和普通Java对象来创建Bean对象,在IoC容器完成自身的创建与初始化后,就产生了一个完全配置好并可执行的系统或应用程序。
即Bean的生命周期由IoC容器管理,IoC容器通过管理Bean对象来构建出一个可用的应用系统。
3. BeanFactory与ApplicationContext
org.springframework.beans
包提供了以编程方式等管理和操作Bean的基本功能,这些功能体现在BeanFactory上。
org.springframework.context
包则添加了ApplicationContext接口(该接口也是上下文包的基础),该接口在实现BeanFactory功能的基础上,还以更面向框架的方式(使用分层和分级上下文)增强了BeanFactory的功能,具体体现如下:
MessageSource
,消息资源处理(用于国际化,i18n)。- 更便利的资源访问,如对URL和文件的访问。
- 事件发布,向实现
ApplicationListener
接口的Bean传播事件。 - 上下文分层,允许加载多个上下文(分层上下文,带有父子层级关系),允许每个上下文专注于一个特定层(如用于网络应用的 WebApplicationContext等等)。
下面是两者支持的特性:
功能特性 | 说明 | BeanFactory | ApplicationContext |
---|---|---|---|
Bean instantiation/wiring | Bean实例化与操作 | Y | Y |
Automatic BeanPostProcessor registration | BPP自动注册 | N | Y |
Automatic BeanFactoryPostProcessor registration | BFPP自动注册 | N | Y |
Convenient MessageSource access (for i18n) | 消息资源国际化处理 | N | Y |
ApplicationEvent publication | 事件发布 | N | Y |
Hierarchical Contexts | 分层上下文 | N | Y |
ApplicationContext继承BeanFactory,实现了BeanFactory的所有功能,因此一般建议优先使用 ApplicationContext;且Spring 2.0 及以上版本大量使用了BeanPostProcessor扩展点(以实现代理等功能),如果使用的是BeanFactory,那么事务和 AOP 等大量支持都将无法生效(至少在不采取额外步骤的情况下无法生效)。
4. 总结
上面的内容整理一下,可以把三者的作用和区别做一个简短的总结:
- Bean由普通的Java对象生成,由Spring IoC容器管理,众多Bean构成了完整应用程序的主干。
- BeanFactory是Spring框架的IoC容器,能够通过灵活的配置机制管理Bean。
- ApplicationContext增强BeanFactory,具备更多企业级功能。
参考:
Introduction to the Spring IoC Container and Beans
3.8.1. BeanFactory or ApplicationContext?
BeanFactory vs ApplicationContext