Spring源码系列(5)- BeanDefinition的注册
前言
本章接着上篇,主要来介绍BeanDefinition的注册,本篇比较重要。
BeanDefinition 这个类是spring的前奏中比较重要的一环,这个类从字面意思,就很清楚,Bean定义的接口,啥意思呢?就是所有的自定义普通bean类,只要想注册到spring容器中,首先得转换成spring认识的类,也就是BeanDefinition,这个里面会包含bean的基础信息,比如类的属性、是否有依赖,依赖的类是什么,是否有父类等等这些。
好,下边进入正题。
注册
spring每次注册前,总会做大量的工作,自然而然BeanDefinition的注册也不例外,我们来看源码。
我们接着上一篇的,进入红框的方法。
点进去后,发现是一个接口,找找实现类,这里默认实现类是DefaultListableBeanFactory。
由于这个类比较重要,所以这里将DefaultListableBeanFactory这个类的作用讲一下。
DefaultListableBeanFactory
DefaultListableBeanFactory是spring中加载bean的核心部分,是spring注册和加载bean的默认实现。
那它与之前讲的XMLBeanFactory什么区别?
XmlBeanFactory是DefaultListableBeanFactory的子类,是对此类的扩展,比如可以通过XmlBeanDefinitionReader来读取xml文件,对于注册以及获取Bean,还是通过父类DefaultListableBeanFactory来实现的。
如果看DefaultListableBeanFactory类图还是很复杂的,不建议大家直接看类图,容易绕晕。
好了,我们继续往下讲,说了半天,还没有进入今天的正题😓
这里还是比较简单的,我们来分析一下。
1、首先,第一步是来验证methodOverrides属性,是在父类AbstractBeanDefinition进行验证的。
2、判断BeanDefinition是否已经注册,
如果存在,则进行相应的验证,再次放入map中。
如果不存在,则把beanDefinition缓存到map中。
这里有一个hasBeanCreationStarted()方法,hasBeanCreationStarted()方法是用来检查工厂是判断bean的创建是否已经开始,这个判断是有alreadyCreated这个集合来判断,后续会讲到这个集合是何时放这些值的。这个方法不是很重要。不用看也可以。
我们重点看看两个集合,一个是beanDefinitionMap,一个是beanDefinitionNames,后续会用到这两块。
beanDefinitionMap 是key-value的map,key就是bean name,value就是对应转换后的BeanDefinition.
beanDefinitionNames这个是一个list,存放beanName的,bean实例化的时候会用到。后边讲到的时候,我们再提。
好了,这就是本章的内容了,下一篇我们开始进入bean的获取。