Spring源码分析心得-Bean的读取和注册
Spring广泛的被使用足以证明它的价值,成功的东西自然值得我们深入学习。有很多人说的熟悉Spring也只是简单的使用经验,当我发现我也是其中一员时我很恐惧,所以开始扒源码,准备深入了解,话不多说,直奔主题。首先我们知道Bean是Spring的核心,所以就从这里入手分析一下Spring是如何创建Bean对象的。首先来看一下Bean的继承关系.

在这份关系图中,我们可以清楚的看见类之间的关系,首先BeanFactory是所有类的父类,准确的说这是一个接口,如果你查找比较老一点的代码的话你可以看见使用的XMLBeanFactory,类似这种BeanFactory bf = new XMLBeanFactory(new ClassPathResources("shuangcheng_wang.xml"));这个类实现了BeanFActory,这个类也是我们分析创建Bean的第一个类,下面看一下源码:

在这个类中大家可能觉得没什么代码啊,确实,其原因是首先它继承了DefaultListabelBeanFactory主要的关键代码都是在这个类中实现的下面我会分析这个类,在这个类中还有一个非常重要的成员属性就是一个XMLBeanDefinitionReader,这个类是敢什么的呢,首先看名字我们大概猜测这是一个xml读取器,因为Spring很大一部分都是配置文件中,在XMlBeanDefinitionReader中是这么解释这个类的功能的:

大致意思就是读取文件,然后生成dom节点,将节点交给BeanDefinitionDocumentReader来处理,在XMLBeanDefinitionReader中主要的逻辑是这样的,首先通过InputStream将配置文件读取进来,然后通过读取的流实例化Document对象,接着通过反射实例化XMLDefinitionDocumentReader,通过这个类处理刚刚创建的document对象,用大神总结的话就是:(1)获取到的xml的验证信息,(2)加载xml文件,并得到对应的Document,(3)根据返回的document信息注册Bean.(其中SAX解析xml文档,如果不知道的可以去随便搜搜),而注册的核心代码如下:

由于个人原因对于这里的一些设计还不是很明白,所以等技术提高以后回来重新修改对注册document的理解。
Spring源码分析心得-Bean的读取和注册的更多相关文章
- Spring 源码分析之 bean 依赖注入原理(注入属性)
最近在研究Spring bean 生命周期相关知识点以及源码,所以打算写一篇 Spring bean生命周期相关的文章,但是整理过程中发现涉及的点太多而且又很复杂,很难在一篇文章中把Spri ...
- Spring源码分析之Bean的创建过程详解
前文传送门: Spring源码分析之预启动流程 Spring源码分析之BeanFactory体系结构 Spring源码分析之BeanFactoryPostProcessor调用过程详解 本文内容: 在 ...
- 【Spring源码分析】Bean加载流程概览
代码入口 之前写文章都会啰啰嗦嗦一大堆再开始,进入[Spring源码分析]这个板块就直接切入正题了. 很多朋友可能想看Spring源码,但是不知道应当如何入手去看,这个可以理解:Java开发者通常从事 ...
- 【Spring源码分析】Bean加载流程概览(转)
转载自:https://www.cnblogs.com/xrq730/p/6285358.html 代码入口 之前写文章都会啰啰嗦嗦一大堆再开始,进入[Spring源码分析]这个板块就直接切入正题了. ...
- Spring源码分析:Bean加载流程概览及配置文件读取
很多朋友可能想看Spring源码,但是不知道应当如何入手去看,这个可以理解:Java开发者通常从事的都是Java Web的工作,对于程序员来说,一个Web项目用到Spring,只是配置一下配置文件而已 ...
- Spring 源码分析之 bean 实例化原理
本次主要想写spring bean的实例化相关的内容.创建spring bean 实例是spring bean 生命周期的第一阶段.bean 的生命周期主要有如下几个步骤: 创建bean的实例 给实例 ...
- 【转载】Spring 源码分析之 bean 实例化原理
本次主要想写spring bean的实例化相关的内容.创建spring bean 实例是spring bean 生命周期的第一阶段.bean 的生命周期主要有如下几个步骤: 创建bean的实例 给实例 ...
- Spring源码分析(六)解析和注册BeanDefinitions
摘要:本文结合<Spring源码深度解析>来分析Spring 5.0.6版本的源代码.若有描述错误之处,欢迎指正. 当把文件转换为Document后,接下来的提取及注册bean就是我们的重 ...
- 【Spring源码分析】.properties文件读取及占位符${...}替换源码解析
前言 我们在开发中常遇到一种场景,Bean里面有一些参数是比较固定的,这种时候通常会采用配置的方式,将这些参数配置在.properties文件中,然后在Bean实例化的时候通过Spring将这些.pr ...
随机推荐
- hihoCoder 搜索一·24点
题目1 : 搜索一·24点 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 周末,小Hi和小Ho都在家待着.在收拾完房间时,小Ho偶然发现了一副扑克,于是两人考虑用这副扑 ...
- 错误描述: 抱歉,该商品的交易金额与原先的不一致,请重新创建交易付款。 错误代码: TRADE_TOTALFEE_NOT_MATCH
由于在支付宝最后支付,出现了问题导致未能支付成功,而支付宝已经记录了当前的网站订单号(out_trade_no),所以下次再以同一张订单进行支付时,就必须与之前的金额一致,否则就报上面的错. 解决方法 ...
- DBUtils开源JDBC类库,对JDBC简单封装(作用是:简化编码工作量,同时不会影响程序的性能)
DBUtils:提高了程序的性能,编程更加简便 架包 mysql-connector-java-jar commons-dbcp-1.4jar commons-pool-1.5.5jar common ...
- jquery简单插件到复杂插件(3)--顶部导航固定
那个效果很多,比如hao123的头部 <!DOCTYPE html> <html> <head> <meta charset="UTF-8" ...
- 解决maven的“Dynamic Web Module 3.0 requires Java 1.6 or newer.”错误
需要添加一个插件,在build标签中添加 <plugins> <plugin> <groupId>org.apache.maven.plugins</grou ...
- android 入门 007(界面跳转)
一.隐式跳转(自定义界面) 界面层: <Button android:id="@+id/sencond_contact" android:layout_width=" ...
- #有如下值集合[11,22,33,44,55,66,77,88,99,90...],将所有大于66值保存至字典的一个key中,将小于66的值保存至大二个key的值
#!/usr/bin/env python #有如下值集合[11,22,33,44,55,66,77,88,99,90...],将所有大于66值保存至字典的一个key中,将小于66的值保存至大二个ke ...
- sql 集合运算
UNION 并运算 UNION 操作符用于合并两个或多个 SELECT 语句的结果集. 请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列.列也必须拥有相似的数据类型.同时,每条 SE ...
- 如何使用github上传自己的开源项目教程
注意: 此教程只针对iOS项目,其他项目请参考此网站 http://jingyan.baidu.com/article/b907e627aadbb246e7891cf1.html 首先进入github ...
- left join 等连接查询遇到同名字段覆盖问题
可以在查询时给字段赋别名,但是需要注意以下:*的位置要在最前面,放在其他地方都会出错.这种写法同名覆盖的字段还在,然后在*的后面加上别名字段,已经可以满足所有需求了 SELECT *,r.id as ...