上次说到ApplicationContext加载BeanDefinition时会创建一个XmlBeanDefinitionReader,将XML解析、BeanDefinition加载委托给XmlBeanDefinitionReader。

首先看下XmlBeanDefinitionReader的类图:

类图比较简单,其主要得属性读取,注册也是交由DefaultBeanDefinitionDocumentReader以及BeanDefinitionParserDelegate去处理。

来看下加载过程

1、AbstractBeanDefinitionReader中会调用ResourceLoader将string文件地址加载为Resource,然后交由XmlBeanDefinitionReader进行加载

2、XmlBeanDefinitionReader中将资源解析为DocumentLoader将资源解析了Document,并创建BeanDefinitionDocumentReader对象将BeanDefinition的解析注册交由其处理

3、DefaultBeanDefinitionDocumentReader中的doRegisterBeanDefinitions方法会初始化BeanDefinitionParserDelegate对象,判定Element是否默认Namespace下的元素,如果是的话执行parseDefaultElement方法,进行默认元素解析,否则调用delegate.parseCustomElement(ele),执行特定NamespaceHandlerResolver的解析

4、processBeanDefinition方法中首先会调用BeanDefinitionParserDelegate的parseBeanDefinitionElement方法,这个方法中会做如下处理:

4.1 createBeanDefinition根据className,parentName调用BeanDefinitionReaderUtils.createBeanDefinition创建一个GenericBeanDefinition
4.2 parseBeanDefinitionAttributes这里解析spring里面默认的一些基础属性如:singleton,scope,lazy-init,autowire,destory-method等
4.3 parseMetaElements解析mate标签数据
4.4 parseLookupOverrideSubElements解析lookup-method标签数据
4.5 parseReplacedMethodSubElements解析replaced-method标签数据
4.6 parseConstructorArgElements解析constructor-arg标签数据
4.7 parsePropertyElements解析property标签数据
4.8 parseQualifierElements解析qualifier标签数据

5、 然后调用BeanDefinitionParserDelegate的decorateBeanDefinitionIfRequired方法,这个方法中会对属性以及子Node进行判定,如果不是默认的NameSpace的话会获取NameSpace对应的NamespaceHandlerResolver,然后进行解析,如下段代码中的c标签,p标签会分别调用SimpleConstructorNamespaceHandler,SimplePropertyNamespaceHandler对象进行解析。

<bean class="com.bread.bean.User"  c:id="123" c:userName="ace" p:id="567">

这些自定义标签的解析配置都是在META-INF/spring.handlers下,如:

http\://www.springframework.org/schema/c=org.springframework.beans.factory.xml.SimpleConstructorNamespaceHandler
http\://www.springframework.org/schema/p=org.springframework.beans.factory.xml.SimplePropertyNamespaceHandler
http\://www.springframework.org/schema/util=org.springframework.beans.factory.xml.UtilNamespaceHandler

6、最后就是调用BeanDefinitionReaderUtils.registerBeanDefinition,这里就是将BeanDefinition交由DefaultListableBeanFactory进行注册。


读spring源码(二)-XmlBeanDefinitionReader-解析BeanDefinition的更多相关文章

  1. Spring源码入门——XmlBeanDefinitionReader解析

    接上篇[] ,我们看到BeanDefinitionReader解决的是从资源文件(xml,propert)到BeanDefinition集合的过程.所以BeanDefinitionReader接口有两 ...

  2. Spring源码入门——DefaultBeanNameGenerator解析 转发 https://www.cnblogs.com/jason0529/p/5272265.html

    Spring源码入门——DefaultBeanNameGenerator解析   我们知道在spring中每个bean都要有一个id或者name标示每个唯一的bean,在xml中定义一个bean可以指 ...

  3. 从零开始学spring源码之xml解析(二):默认标签和自定义标签解析

    默认标签: 上一篇说到spring的默认标签和自定义标签,发现这里面东西还蛮多的.决定还是拆开来写.今天就来好好聊聊这两块是怎么玩的,首先我们先看看默认标签: private void parseDe ...

  4. 读spring源码(一)-ClassPathXmlApplicationContext-初始化

    工作来几乎所有的项目都用到了spring,却一直没有系统的读下源码,从头开始系统的读下吧,分章也不那么明确,读到哪里记到哪里,仅仅作为个笔记吧. 先看ClassPathXmlApplicationCo ...

  5. 从零开始学spring源码之xml解析(一):入门

    谈到spring,首先想到的肯定是ioc,DI依赖注入,aop,但是其实很多人只是知道这些是spring核心概念,甚至不知道这些代表了什么意思,,作为一个java程序员,怎么能说自己对号称改变了jav ...

  6. 想读Spring源码?先从这篇「 极简教程」开始吧...

    为什么要阅读源码?这是一个有趣的问题,类似的问题还有,为什么要看书?为什么要爬山? 这也是一个哲学问题,我想每个人都有不同的答案,下面我是对阅读源码好处的一些思考. (PS:也欢迎你在评论区留言补充) ...

  7. Spring源码之XmlBeanDefinitionReader与Resource

    一.DefaultListableBeanFactory类, 里面有一个成员变量beanDefinitionMap,Bean定义对象的Map, BeanDefinition就对应XML的属性配置 /* ...

  8. Spring源码入门——AnnotationBeanNameGenerator解析

    ---恢复内容开始--- 接上篇,上篇解析了DefaultBeanGenerator生成bean name的过程(http://www.cnblogs.com/jason0529/p/5272265. ...

  9. Spring源码入门——DefaultBeanNameGenerator解析

    我们知道在spring中每个bean都要有一个id或者name标示每个唯一的bean,在xml中定义一个bean可以指定其id和name值,但那些没有指定的,或者注解的spring的beanname怎 ...

随机推荐

  1. 初识Haskell 三:函数function

    对Discrete Mathematics Using a Computer的第一章Introduction to Haskell进行总结.环境Windows 函数毫无疑问是函数式语言的核心. 在Ha ...

  2. 完全自主创建Wrapper Tomcat容器

    Wrapper Tomcat 使用说明1. Wrapper Tomcat 简介1) Wrapper Tomcat 是使用Apache Tomcat 整合 Java Service Wrapper 的一 ...

  3. Markdown语法基础

    Markdown基本语法 创建 2018-09-07 by YANHAI 标题:Setext方式 三个或更多 大标题 === 小标题 --- 大标题 小标题 标题:Atx方式 # 内容 (一级标题) ...

  4. Linux下ansible的group模块

    一.概述 group 模块可以帮助我们管理远程主机上的组. 二.常用参数 name参数:必须参数,用于指定要操作的组名称. state参数:用于指定组的状态,两个值可选,present,absent, ...

  5. mysql索引原理

    1.B+Tree 索引的数据结果是B+Tree,它比BTree查询时,以更少的IO次数占优势. 2.聚集索引与非聚集索引 聚集索引:索引的逻辑顺序与磁盘上数据的物理顺序相同.(表中最多只有一个) 比如 ...

  6. 制作H5像一个div中一张长图,里边是一条一条信息,需要点击的响应式方法

    <style> .nav_box { margin-top: 20vh } .section1 .directory { margin-top: 4vh; position: relati ...

  7. bugku crypto easy-crypto

    长度不一的01字符串 就要考虑是不是摩斯密码 用这个py脚本: from __future__ import print_function a = input("input the stri ...

  8. bugku web 管理员系统

    页面是一个登陆表单,需要账号密码,首先f12查看源代码,发现有一段可疑的注释,明显是base64,解码得到test123,似乎是一个类似于密码的东西,既然是管理员,就猜测用户名是admin,填上去试一 ...

  9. Windows Subsystem for Linux 环境变量

    WSL(Windows Subsystem for Linux )的环境变量是包含Linux子系统和Windows系统的,测试如下: wy@WY-PC:/mnt/c/Windows/System32$ ...

  10. Centos 利用yum安装卸载软件常用命令[转载]

    一.使用yum安装和卸载软件,有个前提是yum安装的软件包都是rpm格式的. 安装的命令是,yum install ~,yum会查询数据库,有无这一软件包,如果有,则检查其依赖冲突关系,如果没有依赖冲 ...