美文网首页
spring 源码解析 —— loadBeanDefinitio

spring 源码解析 —— loadBeanDefinitio

作者: 寒叶xly | 来源:发表于2018-11-27 11:18 被阅读0次

    spring 容器启动时可以分解成两部分,第一部分为元数据的加载,第二部分即为bean的实例化,这一章节主要从第一部分开始讲解。分析源码前,先看看spring xml配置和使用到的bean信息。

    图一:spring xml 配置文件 图二:启动 spring 容器 图三:Person 类 图四:Stu 类

    当执行截图二中的main方法时,第11行,加载test-spring.xml配置文件。本章节主要讲述的是spring如何加载配置文件,如何解析其中的各个element,解析完成之后是如何存储bean的元数据,带着这三个问题,我们一起进入源码。

    BeanFactory beanFactory =new XmlBeanFactory(new ClassPathResource("config/spring/test-spring.xml"));首先一起看下创建ClassPathResource对象时spring容器做了哪些操作。

    图五:创建 ClassPathResource   对象

    从截图中可以看出,创建ClassPathResource对象主要是获取配置文件的相对路径和设置类的加载器。当拿到了配置文件的路径时,下面就是要对配置文件进行加载和解析等操作了。

    图六:初始化容器入口 图七:设置编码和字符集 图八:doLoadBeanDefinition 准备

    doLoadBeanDefinition 需要特别关注,是执行加载元数据到容器中重要方法。进入方法,查看在加载过程中spring容器都有哪些操作。

    图九:解析xml和注册bean信息入口

    当源码看到此处时,已经到了spring容器解析xml文件和注册bean信息入口了,下面将分别针对截图中的 步骤1和步骤2进行一个详细的讲解。

    1、doLoadDocument(inputSource,resource);

    方法作用:
    (1)获取xml配置文件的模式:自定义,dtd,xsd
    (2)获取EntityResolver对象,进行nameSpaceUrl进行解析
    (3)对于配置xml文件格式进行验证并且转化为Document对象
    下面分别对以上的功能点进行源码层面上的分析。

    图十:spring xml配置文件转化为Document对象入口 图十一:xml配置文件解析

    2、registerBeanDifinitions(doc,resource)

    图十二:注册beanDifinition入口

    上方截图中通过1,2分别记录注册前和注册后beanDifinition数量,做差值计算一共注册了多少个bean的信息。
    3就是注册beanDifinition的入口了。

    图十三:获取配置文件根节点 图十四:对于根路径下profile属性特殊处理 图十五:标签解析入口

    到达这一部分,spring标签解析已经到达了精彩的部分,再次需要解释一下什么是自定义标签和默认标签。
    spring 默认标签即spring原生标签:beans,bean,import,alias,只有四个
    spring 自定义标签:context:component-scan ,aop:aspectj-autoproxy等等。
    从截图的判断可以看出,针对于不同的标签,spring是提供了不同的解析方式的,接下来就是对于不同标签的解析过程。

    图十六:spring默认标签解析

    相关文章

      网友评论

          本文标题:spring 源码解析 —— loadBeanDefinitio

          本文链接:https://www.haomeiwen.com/subject/rzsuqqtx.html