Spring IoC容器是一个提供IoC支持的轻量级容器,除了基本的IoC支持,它作为轻量级容器还提供了IoC之外的支持。如在Spring的IoC容器之上,Spring还提供了相应的AOP框架支持、企业级服务集成等服务。Spring的IoC容器和上节提到的IoC Service Provider 所提供的服务之间存在一定的交集。二者的关系如图:
注意:ApplicationContext间接继承自BeanFactory,所以说它是构建于BeanFactory之上的IoC容器。此外,你应该注意到了, ApplicationContext还继承了其他四个接口,图中少了一个Environment。
BeanFactory,顾名思义,就是生产Bean的工厂,作为Spring提供的基本的IoC容器,BeanFactory可以完成作为IoC Service Provider的所有职责,包括业务对象的注册和对象间依赖关系的绑定。
BeanFactory就像一个手机生产厂,你可以从其他的手机零件厂商或者你自己的零件生产部门取得汽车零件送入手机生产厂,最后只需要取出手机即可。而我们同样也是把所有的业务对象交给BeanFactory,然后直接从BeanFactory取得最终组装完成并且可用的对象,至于这个中间“生产过程”,你无需了解,这一切的一切都有BeanFactory帮你搞定!
下面就让我们从理解原理到自己用代码实现一个BeanFactory!
先说说我们的原理:
BeanFactory只是一个接口,我们最终需要一个该接口的实现来进行实际的Bean的管理,DefaultListableBeanFactory就是这么一个比较通用的BeanFactory实现类。DefaultListableBeanFactory除了间接地实现了BeanFactory接口,还实现了BeanDefinitionRegistry接口,该接口才是在BeanFactory的实现中担当Bean注册管理的角色,基本上,BeanFactory接口只定义如何访问容器内管理的Bean的方法,各个BeanFactory具体实现类负责具体Bean的注册以及管理工作。BeanDefinitionRegistry接口定义抽象了Bean的注册逻辑。通常情况下,具体的BeanFactory实现类会实现这个接口来管理Bean的注册。
它们的关系如下图所示:
打个比方说,BeanDefinitionRegistry就像商店的货架,所有的商品都是放在货架上的,虽然我们买东西或者送货都是和商店(BeanFactory)打交道,但是货架才是商店存放商品的地方,所以货架相对于商店来说,就是它的BeanDefinitionRegisry。
每个受管的对象