![mark](https://img.zouchanglin.cn///20200405/HbNPDVawlHpU.png)
ICO容器的结构如上图所示,首先要让IOC容器去读取Bean的配置信息,并在容器中生成一份相应的Bean定义注册表,根据这张注册表去实例化Bean,装配好Bean之间的依赖关系,为上层提供准备就绪的环境,Spring提供一个配置文件描述Bean还有Bean之间的依赖关系,利用Java语言的反射功能实例化Bean并建立Bean之间的依赖关系。
SpringIOC容器支持的功能
1、依赖注入
2、依赖检查
3、自动装配
4、支持集合
5、指定初始化和销毁的方法
6、支持回调方法,但是需要实现Spring的接口,略带有侵入性
其中最核心的功能就是依赖注入和自动装配了。
SpringIOC源码分析
Spring 作者 Rod Johnson 设计了两个接口用以表示容器。BeanFactory和ApplicationContext, BeanFactory 粗暴简单,可以理解为就是个 HashMap,Key 是BeanName,Value 是 Bean 实例。通常只提供注册(put),获取(get)这两个功能。我们可以称之为 “低级容器”。 ApplicationContext 可以称之为 “高级容器”。因为他比 BeanFactory 多了更多的功能。他继承了多个接口。因此具备了更多的功能。
BeanDefinition
BeanDefinition与Bean的关系, 就好比类与对象的关系,类在spring的数据结构就是BeanDefinition。根据BeanDefinition得到的对象就是我们需要的Bean。 理解Bean与BeanDefinition是理解spring的整个架构的基础与关键, BeanDefinition接口是顶级基础接口,用来描述Bean,里面存放Bean元数据,比如Bean类名、scope、属性、构造函数参数列表、依赖的bean、是否是单例类、是否是懒加载等一些列信息。
BeanDefinition继承的两个接口:
- BeanMetadataElement接口:BeanDefinition元数据,返回该Bean的来源
- AttributeAccessor接口:提供对BeanDefinition属性操作能力,
继承或实现BeanDefinition的接口:
AbstractBeanDefinition类:抽象类统一实现了BeanDefinition定义的一部分操作,可以说是定义了BeanDefinition很多默认的属性。 正是在AbstractBeanDefinition基础上, Spring衍生出了一些列BeaDefinition。
这里我们可以关注下重写的equals()、hashcode()、toString()方法
此外initMethodName属性,destroyMethodName 属性,这两个属性bean的生命周期有关,此处只提一句,后续讲解。
接下来,我们看看从AbstractBeanDefinition上衍生出来的几个类
- RootBeanDefinition: 代表一个xml,java Config来的BeanDefinition
- ChildBeanDefinition: 可以让子BeanDefinition定义拥有从父母哪里继承配置的能力
- GenericBeanDefinition: spring2.5后注册bean首选的是GenericBeanDefinition。GenericBeanDefinition允许动态的设置父bean.GenericBeanDefinition可以作为RootBeanDefinition与ChildBeanDefinition的替代品。
- AnnotatedBeanDefinition接口: 表示注解类型BeanDefinition。有两个重要的属性,AnnotationMetadata,MethodMetadata分别表示BeanDefinition的注解元信息和方法元信息 实现了此接口的BeanDefinition可以获取到注解元数据和方法元数据。
- AnnotatedGenericBeanDefinition类: 表示@Configuration注解注释的BeanDefinition类
- ScannedGenericBeanDefinition类: 表示@Component、@Service、@Controller等注解注释的Bean类
BeanDefinitionRegistry
提供向IOC容器注册BeanDefinition对象的方法,将定义Bean 的资源文件解析成 BeanDefinition 后需要将其注入容器中,这个过程就是由 BeanDefinitionRegistry 来完成。 BeanDefinitionRegistry 继承了 AliasRegistry 接口,其核心子类有三个:SimpleBeanDefinitionRegistry、DefaultListableBeanFactory、GenericApplicationContext。
![mark](https://img.zouchanglin.cn///20200405/E5QxQebdaucd.png)
- AliasRegistry: 用于别名管理的通用型接口,作为 BeanDefinitionRegistry 的顶层接口。AliasRegistry 定义了一些别名管理的方法。