spring源码学习(三)解析和注册BeanDefinition(上)

spring通过registerBeanDefinitions来解析和注册BeanDefinition。下图是其中的源码,位于XmlDefinitionsReader类中
registerBeanDefinitions

1.先实例化了BeanDefinitionDocumentReader对象
在实例化BeanDefinitionReader对象的时候,会把DefinitionRegistry传入,默认使用的使用的是DefaultListableBeanFactoryde的子类,然后在这getRegistry取到的就是这个Registry,然后调用getBeanDefinitionCount方法来获取当前BeanDefinition的加载个数
传入对象

继续往下点可以看到AbstractBeanDefinitionReader构造函数里传入registy 的语句
传入的this就是xmlBeanFactory 是DefaultListableBeanFactoryde的子类
spring源码学习(三)解析和注册BeanDefinition(上)_第1张图片
然后这里this.regiesty=registy 就是传入的语句

2.registerBeanDefinitions方法是用来加载和注册Bean的主要方法
进入registerBeanDefinitions函数
spring源码学习(三)解析和注册BeanDefinition(上)_第2张图片
里面的doRegisterBeanDefinitions函数才是真正开始注册bean的核心工作,之前的各种处理只是为注册bean做了准备工作,把xml文档转换成此函数可以接受的数据类型。
spring源码学习(三)解析和注册BeanDefinition(上)_第3张图片
函数先备份了this.delegate,然后开始使用新建的BeanDefinitionParserDelegate开始解析root,一开始判断root的namespaceUri是否等于http://www.springframework.org/schema/beans,是的话看是否有profile属性,没有则继续解析,有的话则看是否为activeProfiles,如果是则setActiveProfiles,源码自行查看,主要功能是为了让spring有多套环境配置,在不同场景使用不同的配置环境,比如开发环境和生产环境。
preProcessXml(root);和postProcessXml(root);是两段空函数,是设计模式中的模板模式,以后继承他的类重写两个函数后,方法可以按照现有的逻辑执行。

parseBeanDefinitions是继续解析root的主要函数,parseBeanDefinitions函数里判断若root的namespaceUri等于http://www.springframework.org/schema/beans,用parseDefaultElement解析,否则用parseCustomElement解析。
spring源码学习(三)解析和注册BeanDefinition(上)_第4张图片

3.最后返回的是本此加载的BeanDefinition的个数

你可能感兴趣的:(spring源码学习)