Spring:看完源码,还是搞不懂这三货是啥关系?一篇了解Bean、BeanFactory、ApplicationContext


1. 简述三者关系

Spring官方文档中,有一段话描述了三者的关系:

org.springframework.beansorg.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等等)。

下面是两者支持的特性:

功能特性说明BeanFactoryApplicationContext
Bean instantiation/wiringBean实例化与操作YY
Automatic BeanPostProcessor registrationBPP自动注册NY
Automatic BeanFactoryPostProcessor registrationBFPP自动注册NY
Convenient MessageSource access (for i18n)消息资源国际化处理NY
ApplicationEvent publication事件发布NY
Hierarchical Contexts分层上下文NY

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值