概述

上一篇【Spring 加载、解析applicationContext.xml 流程】分析了从xml文件加载到开始解析xml里面的标签为止,基本都是跟spring 真正的核心没什么关系。
这篇我们分析 applicationContext.xml 中的bean 标签解析。

parseDefaultElement() 方法

org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.java

  1. 解析 import 标签
  2. 解析 alias 标签
  3. 解析 bean 标签
  4. 解析 beans 标签

processBeanDefinition() 方法


1. 解析bean标签(id、name、alias、class、score …),并封装成BeanDefinitionHolder 对象返回。
2. decoreBeanDefinitionIfRequired() 方法解析自定义标签,如果bean标签中包含自定义标签,则解析自定义标签
3. bean解析完成后,对bdHolder 进行注册。

parseBeanDefinitionElement() 方法


解析id和name属性,name属性可以配置多个值,以逗号分割。name中的值相当于中配置的值

1. 调用parseBeanDefinitionElement()方法,解析bean标签的其它属性,返回一个GenericBeanDefinition对象
2. 判断beanName是否有值,如果没有则自动生成beanName
3. 构造BeanDefinitionHolder 对象,并返回

parseBeanDefinitionElement() 方法


1. 创建 GenericBeanDefinition 对象
2. 解析bean的所有属性
3. 解析 标签
4. 解析 标签
5. 解析 标签
6. 解析 标签
7. 解析 标签
8. 解析 标签
9. 解析 标签

1. 创建 GenericBeanDefinition 对象

createBeanDefinition()方法


创建GenericBeanDefinition实例
GenericBeanDefinition 继承了 AbstractBeanDefinition。
AbstractBeanDefinition 对应这一个标签,bean标签中每一个属性都能在AbstractBeanDefinition 中找到对应的元素。

2. 解析bean的所有属性

AbstractBeanDefinition() 方法



解析bean标签的各种属性, 然后存储到GenericBeanDefinition 对象中,并返回。

<!-- 配置的bean标签属性 -->
<bean id="" name="" class="" lazy-init="default" abstract="true" autowire-candidate="default" autowire="default" depends-on="" destroy-method="" factory-bean="" factory-method="" init-method="" primary="true" scope="" />

3. 解析 标签

调用DomUtils.getChildElementValueByTagName(ele, DESCRIPTION_ELEMENT)方法解析

4. 解析 标签

5. 解析 标签

6. 解析 标签

7. 解析 标签


1. 解析index、type、name 属性
2. 构造ConstructorArgumentValues.ValueHolder对象,把name、type、name、value存储到该对象中
3. 如果有index属性,则把 valueHolder 存储到ConstructorArgumentValues.indexedArgumentValues 属性中
4. 如果没有index属性,则把valueHolder存储到ConstructorArgumentValues .genericArgumentValues 属性中

ConstructorArgumentValues 类结构
public class ConstructorArgumentValues {private final Map<Integer, ValueHolder> indexedArgumentValues = new LinkedHashMap<>(0);private final List<ValueHolder> genericArgumentValues = new LinkedList<>();......public static class ValueHolder implements BeanMetadataElement {@Nullableprivate Object value;@Nullableprivate String type;@Nullableprivate String name;@Nullableprivate Object source;private boolean converted = false;@Nullableprivate Object convertedValue;......}
}

8. 解析 标签

解析的子标签

parsePropertyElement()


调用parsePropertyValue() 方法获取property的值。

parsePropertyValue() 方法

1. 获取子标签,并跳过 meta 和 description 标签的解析
2. 获取 property 的ref 和value 的属性。
3. 如果即存在 ref 属性又存在 value 属性,或者存在ref 或value 属性的同时还存在子标签,则标签规则错误。


1. 如果存在ref 属性,则使用RuntimeBeanReference对象封装ref
2. 如果存在value属性,则使用TypeStringValue封装
3. 如果存在子标签则处理解析子标签

解析子标签 parsePropertySubElement()


1. 如果不是默认的标签,则执行嵌套自定义标签解析
2. 解析bean标签
3. 解析ref 标签
4. 解析idref 标签
5. 解析value标签

6. 解析null标签
7. 解析array标签
8. 解析list标签
9. 解析set 标签
10. 解析map标签
11. 解析prop标签

9. 解析 标签

解析完bean的所有属性,子标签后和自定义标签后存储到 GenericBeanDefinition 对象中,然后调用DefaultListableBeanFactory.registerBeanDefinition(beanName, definitionHolder.getBeanDefinition());把beanDefinitoin注册到 beanDefinitionMap中。

beanDefinitionMap 定义

private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);

想了解更多精彩内容请关注我的公众号

本人简书blog地址:http://www.jianshu.com/u/1f0067e24ff8    
点击这里快速进入简书

GIT地址:http://git.oschina.net/brucekankan/
点击这里快速进入GIT

Spring bean 标签加载、解析过程分析相关推荐

  1. Spring Bean懒加载与非懒加载

    懒加载:对象使用的时候才去创建.节省资源,但是不利于提前发现错误: 提前加载:容器启动时立马创建.消耗资源,但有利于提前发现错误 Spring 默认设置是非懒加载 1,由于在controller中会注 ...

  2. 《Spring源码深度解析 郝佳 第2版》bean的加载、循环依赖的解决

    往期博客: <Spring源码深度解析 郝佳 第2版>容器的基本实现与XML文件的加载 <Spring源码深度解析 郝佳 第2版>XML标签的解析 往期博客完成了xml文件加载 ...

  3. Spring 源码解析(四):bean的加载

    //spring.xml 文件解析BeanFactory factory = new XmlBeanFactory(new ClassPathResource("spring.xml&quo ...

  4. bean的加载-配置文件的解析

    bean的加载-配置文件的解析 spring的启动流程部分内容比较多,因此在之前先做了以下这些源码分析,这些要简单些. spring-webmvc启动流程 spring-webmvc请求处理流程 sp ...

  5. Spring源码——bean的加载

    前言 内容主要参考自<Spring源码深度解析>一书,算是读书笔记或是原书的补充.进入正文后可能会引来各种不适,毕竟阅读源码是件极其痛苦的事情. 本文主要涉及书中第五章的部分,依照书中内容 ...

  6. 【Spring源码分析系列】bean的加载

    前言 以 BeanFactory bf  = new XmlBeanFactory(new ClassPathResource("beans.xml"));为例查看bean的加载过 ...

  7. 面试官:讲讲Spring框架Bean的加载过程

    spring作为目前我们开发的基础框架,每天的开发工作基本和他形影不离,作为管理bean的最经典.优秀的框架,它的复杂程度往往令人望而却步. 不过作为朝夕相处的框架,我们必须得明白一个问题就是spri ...

  8. Spring框架如何加载和定义Spring Bean类?

    本篇介绍什么是Spring Bean类,如何创建Bean类,以及如何将Bean类添加到Spring IOC容器.通过本篇的学习,可以达成如下目标. ● 认识Spring Bean类 ● 掌握Bean类 ...

  9. Spring 源码分析(七)--bean的加载详细分析

    一:缓存中获取单例bean 前面已经提到过,单例在Spring的同一个容器内只会被创建一次,后续再获取bean直接从单例缓存中获取,当然这里也只是尝试加载,首先尝试从缓存中加载,然后再次尝试从sing ...

最新文章

  1. 磁盘基准测试Bonnie++
  2. linux共享库 == windows动态库
  3. Linux cp命令 拷贝文件
  4. mysql使用 BETWEEN AND 查询
  5. 如何使用bootstrap实现轮播图?
  6. excel表头_Spring Boot实现导出Excel功能
  7. 企业级整站集群数据备份项目方案详解
  8. iOS--开发从入门到精通
  9. Python+OpenCV:图像对比度受限自适应直方图均衡化(CLAHE, Contrast Limited Adaptive Histogram Equalization)
  10. 关于zynq lwip link speed for phy address 1:0的问题
  11. ENVI操作:监督分类
  12. 转自 静心梦工厂
  13. 首都师范 博弈论 5 2 1帕累托最优
  14. 德州农工大学计算机专业如何,德州农工大学美国排名
  15. 我喜欢生命本来的样子
  16. 世纪佳缘推智能设备 是衰退迹象 还是第二春征兆?
  17. v-if判断字符串是否相等
  18. IT 人的纠结:去大公司还是去小公司?
  19. 类似损失函数符号L的字母怎么在mathtype打出来?
  20. LOG边缘检测--Marr-Hildreth边缘检测算法

热门文章

  1. android上滑隐藏动画,ListView上滑和下滑,显示和隐藏Toolbar的实现方法
  2. eclipse mysql5.7_MySQL5.7、Navicate、jdk、Tomcat、eclipse全套配置及安装(win10)-Go语言中文社区...
  3. 来试试读论文的新神器!AMiner发布“论文背景文献”一键生成工具,帮你搞清一篇论文的“来龙去脉”...
  4. 积分梯度:一种新颖的神经网络可视化方法
  5. 那个双非本科,还想转算法岗的姑娘,最后怎么了?
  6. KDD 18 论文解读 | GraphWave:一种全新的无监督网络嵌入方法
  7. NLP多任务学习:一种层次增长的神经网络结构 | PaperDaily #16
  8. 微信好友特征数据分析及可视化
  9. HihoCode1721删除一个字符之后是回文字符串
  10. nutz ajax ie8,版本升级