通俗理解spring源码(一)—— 容器的基本实现


通俗理解spring源码(一)—— 容器的基本实现

大家都知道spring的主要功能就是将本来由我们程序员new出来的对象,交给spring管理。这个管理不仅包括实例化的过程,还包括依赖注入等整个bean生命周期的管理。而spring是通过一个容器,来管理所有bean的。

spring容器的概念,和现实生活中容器的概念是差不多的,即一个可容纳物体的东西,杯子可以装水,杯子是个容器,衣柜可以装衣服,衣柜是一个容器。那么抽象到java中,能存放对象的东西,就是一个容器,在spring中,容器通常用map或list等集合来实现,然后再通过一个对象来引用这个集合,那么这个对象也叫做一个容器,spring把这个对象叫做beanFactory。

那么这个容器是如何初始化的?简单一句话就是,通过我们配置的xml文件或者注解,来告诉spring你想实例化怎样的一个bean?这个bean的属性是怎样的?与其他bean的依赖关系?等等,spring通过一系列复杂的过程,初始化该容器,我们需要什么对象,直接从容器中拿就好了。

关于spring的容器,涉及的类就多了,我的学习方法是,先不看具体的方法和实现,首先从一些核心的接口和抽象类着手,配合类的层次结构图,了解整体的结构和功能。而关于这些接口和抽象类,首先从名称上就能大致知道其功能,因为spring官方的命名是非常规范的, 所以有一定的英语基础对学习源码是很有帮助的。了解了这些接口的功能后,在源码中看到这个名称,就知道是干什么的了,不至于跳来跳去,而晕头转向。

 

 

 

 真正的容器是DefaultListableBeanFactory,他是通过层层继承而来的,从上图可以很清晰的(请选择性忽略图片的清晰度)从全局角度了解DefaultListableBeanFactory的脉络,他的父亲、爷爷、曾爷爷都在上面了,只要知道了他祖宗十八代的功能,就可以知道DefaultListableBeanFactory的功能了。

  •  AliasRegistry:别名注册中心,注册中心相当于登记处,提供了对别名的注册,还包括增删改查等操作,由于接口中不能有成员变量(非常量),所以一定会有一个实现类中通过一个容器保存别名,其他接口也类似。
  • SimpleAliasRegistry:简单别名注册中心,是接口AliasRegistry的实现,增加了一个map容器来保存别名。
  • SingletonBeanRegistry:单例bean的注册中心,顾名思义,该接口定义了对单例bean的注册及获取,
  • BeanFactory:bean的工厂,用来存放bean,定义获取bean及bean的各种属性。
  • DefaultSingletonBeanRegistry:为SingletonBeanRegistry的默认实现,定义了一个容器保存所有单例bean,同时继承了SimpleAliasRegistry,所以该类既是一个单例bean的注册中心,也是别名的注册中心。
  • HierarchicalBeanFactory:有层级的bean工厂,在BeanFactory定义的功能的基础上增加了对parentFactory的支持。
  • BeanDefinitionRegistry:BeanDefinition的注册中心,定义对BeanDefinition的增删改查(BeanDefinition就是对bean的描述,包括bean的class、scope、id等,以后会详细介绍)。
  • FactoryBeanRegistrySupport:FactoryBean注册的支持,在DefaultSingletonBeanRegistry基础上增加了对FactoryBean的特殊处理功能(FactoryBean是工厂bean,BeanFactory是bean工厂,以后会详细介绍)。
  • ConfigurableBeanFactory:可配置的bean工厂,提供配置Factory的各种方法。
  • ListableBeanFactory:可列举的bean工厂,提供了getBean等根据各种条件获取bean的方法。
  • AbstractBeanFactory:抽象bean工厂,综合FactoryBeanRegistrySupport和ConfigurableBeanFactory的功能;
  • AutowireCapableBeanFactory:可自动注入的bean工厂,提供创建bean、自动注入、初始化以及应用bean的后处理器。
  • AbstractAutowireCapableBeanFactory:抽象的可自动注入的bean工厂,综合AbstractBeanFactory并对接口AutowireCapableBeanFactory进行实现。
  • ConfigurableListableBeanFactory:可配置、可列举的bean工厂,beanFactory配置清单,指定忽略类型及接口等。
  • DefaultListableBeanFactory:综合上面所有功能,即可配置、可列举、可处理依赖注入、可处理factoryBean,既是bean工厂,也是BeanDefinition、Alias的注册中心,还能引用父容器。是真正的spring容器,beanDefinition的注册以及单例bean的实例化等功能都由他来完成。

 到目前为止,只是介绍了与spring容器相关核心类的大致介绍,个人觉得看完后只要有个大致印象,看到某个接口名或类名,能够记起他的大致功能,那么本文的目的就达到了。

接下来的博客中,会从加载xml配置文件开始,解开spring容器初始化的谜底。

参考:spring源码深度解析。


作者:扬帆起航0529,发布于:2020/04/11
原文:https://www.cnblogs.com/xiaohang123/p/12676754.html