SpringIoC

概述

Spring中,IoC容器是实现IoC的载体,它可以在对象生成或初始化时直接将数据注入到对象中,也可以通过将对象引用注入到对象数据域中的方式来注入对方法调用的依赖.

这种依赖注入是递归的,对象被组成注入

依赖注入流程

阶段一: 收集和注册

第一个阶段可以认为是构建和收集bean定义的阶段,在这个阶段中,我们可以通过XML或者Java代码的方式定义一些bean,然后通过手动组装或者让容器基于某些机制自动扫描的形式,将这些bean定义收集到IoC容器中

阶段二: 分析和组装

第一阶段完成后,可以暂且认为IoC容器中充斥着一个个独立的bean,这是它们之间还没有任何关系.但实际上,它们之间是有依赖关系的,所以,IoC容器在第二阶段要干的事情就是分析这些已经在IoC容器中的bean,然后根据它们之间的依赖关系先后组装它们

IoC容器

在Spring IoC容器的设计中,我们可以看到两个主要的容器系列,一个是实现BeanFactory接口的简单容器系列,这系列容器只实现了容器最基本的功能;另一个是ApplicationContext应用上下文,它作为容器的高级形态而存在.应用上下文在简单容器的基础上增加了许多面向框架的特性,同时对应用环境做出了许多适配

BeanFactory

BeanFactory的应用场景

BeanFactory接口设计了getBean方法,这个方法是使用IoC容器API的主要方法,通过这个方法,可以取得IoC容器中管理的Bean,Bean的取得是通过指定名字来索引的.如果需要在获取Bean时对Bean的类型进行检查,BeanFactory接口定义了带有参数的getBean方法,这个方法的使用与不带参数的getBean方法类似,不同的是增加了对Bean检索的类型的要求.

用户可以通过BeanFactory接口方法中的getBeean使用Bean的名字,从而在获取Bean时,如果需要获取的Bean是prototype类型的,用户还可以为这个prototype类型的Bean生成指定构造函数的对应参数.这使得在一定程度上可以控制生成prototype类型的Bean
有了BeanFactory的定义,用户可以执行以下操作:

  • 通过接口方法containsBean让用户能够判断容器是否含有指定名字的Bean
  • 通过接口方法isSingleton来查询指定名字的Bean是否是Singleton类型的Bean.对于Singleton属性,用户可以在BeaDefinition中指定
  • 通过接口方法isPrototype来查询指定名字的Bean是否是prototype类型的.对于prototype属性,用户可以在BeanDefinition中指定
  • 通过接口方法isTypeMatch来查询指定了名字的Bean的Class类型是否是特定的Class类型.这个Class类型可以由用户来指定
  • 通过接口方法getType来查询指定名字的Bean的Class类型
  • 通过接口方法getAliases来查询指定了名字的Bean的所有别名,这些别名都是用户在BeaDefinition中定义的

BeanFactory容器的设计原理

BeanFactory接口提供了使用IoC容器的规范.在这个基础上,Spring还提供了符合这个IoC容器接口的一系列容器的实现供开发人员使用.比如,XmlBeanFactory设计的类继承关系:
QQ截图20190902202114.png

它只提供最基本的IoC容器的功能.