Spring源码学习

Spring IoC源码学习:总览 前言 Spring 作为现在最优秀的框架之一,被广泛的应用于 Java 项目中,但是大多数人都只知道如何使用,而不知其中的原理。对大多数人来说可能知道如何使用已经足够了,但是对于想提升自己的人来说,学习 Spring 的源码是一个不错的选择。在过去的几个月里,我利用空闲时间将 IoC 的相关源码学习了一下,按照老习惯准备整理成笔记,以博文的形式记录下来,供自己以后使用,也供其他网友参考。由于涉及... 阅读详情

一、 概述

二、 Spring 初始化之旅

a) Spring 初始化的时候首先要运行的类为: org.springframework.web.context. ContextLoaderListener 或 org.springframework.web.context. ContextLoaderServlet 。

它们在初始化函数里无一例外地实例化了 ContextLoader 类 , 然后调用了它的函数 public WebApplicationContext initWebApplicationContext(ServletContext ) 。

接下来看一下在这个方法里干了写什么

b) 在他的方法体内,关键是“ this.context = createWebApplicationContext(servletContext, parent); ”新建了一个“ ConfigurableWebApplicationContext ”类型的对象,在这一步实例化中几乎完成了所有的 spring 初始化工作。读取了所有的 spring 配置文件。它的工作步骤如下所述。

c) 首先,在将“ ConfigurableWebApplicationContext ”类型的对象实例化以后(这个对象实际的类型是这个包内的 XmlWebApplicationContext ),然后又给这个实例设置了三个属性,“ wac.setParent(parent); ”在默认的初始化过程中这一步设置了一个 null 值,然后又设置了一个“ wac.setServletContext(servletContext); ”,将系统默认的上下文设置进来,比较重要的是下面这一段:

if (configLocation != null) {

// 读取 spring 的应用配置文件

wac.setConfigLocations(StringUtils.tokenizeToStringArray(configLocation,Configurabl eWebApplicationContext.CONFIG_LOCATION_DELIMITERS));

}

它将我们的配置文件名放置到 wac 变量中,以待在后续的操作中使用。然后调用 “ wac.refresh(); ”完成主要的初始化 BeanFactory 的操作。如下。

d) 首先我们应该看一下我们实例化的对象

org.springframework.web.context.support.XmlWebApplicationContext 的类图:

xx.jpg

e) “ wac.refresh(); ”从类结构里我们能找到这个方法来自它的父类: AbstractApplicationContext 在它的 refresh() 方法内我们可以看到 spring 的复杂逻辑。

首先执行了 refreshBeanFactory(); (来自 AbstractRefreshableApplicationContext )见 f),

f) refreshBeanFactory(); 这个方法由负责维护变量 beanFactory 的子类 AbstractRefreshableApplicationContext 实现,默认情况下这个方法直接实例化一个新的 DefaultListableBeanFactory 类型的 BeanFacorty, 然后调用一个起缓冲作用的配置函数生成一个将 beanFacroty 包装起来的对象 beanDefinitionReader ,然后对这个对象进行属性配置,实际上该方法主要负责生成一个临时的操作对象,对应调用的函数为“ loadBeanDefinitions(beanFactory); ”该方法为初始化期间较为重要的一个。 该方法来自其子类: AbstractRefreshableWebApplicationContext 对应的函数:

protected void loadBeanDefinitions(DefaultListableBeanFactory) ,然后这里又调用了自己定义的 protected void loadBeanDefinitions(XmlBeanDefinitionReader) 方法。此时,它就使用到了在 c) 中设置了的( wac.setConfigLocations(……)) 我们开发中密切相关的配置文件。(同时也要记住此时这个函数的参数 beanDefinitionReader ,之前已经设置了“beanDefinitionReader.setResourceLoader(this);”这里的 this 是我们在前面见到的 XmlWebApplicationContext(一个定义好了的上下文))。接着往下:

“ reader.loadBeanDefinitions(configLocations[i]); ” reader 开始加载我们配置文件内的东西了,不过真正复杂的实现此时才开始,我们继续往下走,在接下来的方法内默认情况下会执行:

if (resourceLoader instanceof ResourcePatternResolver) (该判断条件为 true ) , 由于从上面我们知道:beanDefinitionReader.setResourceLoader(this);而 this 的类型为: XmlWebApplicationContext所以 ((ResourcePatternResolver) resourceLoader).getResources(location);得到一个 Resource[] 数组,接下来调用:

int loadCount = loadBeanDefinitions(resources);该函数继续调用自己子类定义的一系列临时接口最终执行到 return doLoadBeanDefinitions(inputSource, encodedResource.getResource());在这个函数内初始化了处理 xml 文件的一些对象并将用户的配置文件解析为一个 Document 对象。然后又执行了一系列函数直到

return parser.registerBeanDefinitions(this, doc, resource);这个函数来自我们新建的 DefaultXmlBeanDefinitionParser ,在这个类里最终执行了对 xml 文件的解析工作和对 beanFacroty 变量执行了设置工作。

g) 终于我们从这些繁杂的逻辑中跳了出来,继续执行 AbstractApplicationContext.refresh() 下面的工作,后续的代码主要仍旧是往一些常量里面设值。

此时 spring 初始化过程就结束了。

转载http://www.blogjava.net/javajohn/archive/2006/07/05/56814.html
《Spring》源码学习指南:有时候不是你笨!掌握正确的学习方法很重要。 因为不断有朋友,或留言,或私信,问我Spring源码阅读问题。我本有心回答,但奈何这是一个非三言两语能说清出的事。所以就决定写一篇小文,来分享下我的浅薄经验。 因为Spring的源代码量非常大。如果像阅读小说一样,一行不拉的读,是不现实的。所以,现实,而且有用的做法,是只阅读核心代码。 至于其他边支代码,如果通读,一则不现实,二则没有必要。 但因为Spring复杂,且设计精妙。初学者刚开始阅读,必然会面比较茫然,不知从那里入手。而我的做法,有一下几个关键点: 1.先掌握Spring的基本用法。 在阅读Spr 阅读详情

相关推荐

汽车级智能栅极驱动器深度解析 | 连载01:DRV871x-Q1系列产品架构与核心特性

集成度:单芯片集成多通道驱动器、电源管理、电流检测智能化:自适应控制算法,减少外部元件可靠性:多重保护机制,满足汽车级要求灵活性:SPI和硬件两种接口,适应不同应用需求。

VehSwHwDeveloper的博客 1155

Spring源码学习大纲

通过以上大纲的学习,可以方便掌握Spring源码的核心设计与实现,提升对Spring框架的深入理解。

专注于技术分享 665

LVGL多线程编程避坑指南:从音乐播放器项目看UI与后台任务如何安全协作

本文深入探讨LVGL在多线程环境下的安全协作问题,以音乐播放器项目为例,解析UI与后台任务(如mplayer音频播放器)的典型冲突场景。提供全局互斥锁规范、任务队列异步处理等核心策略,并分享mplayer进程集成方案与进度条优化技巧,帮助开发者规避界面卡顿、内存损坏等常见问题。

weixin_42531494的博客 134

怎么学习spring架构源码

学习Spring框架源码是一项复杂但非常有价值的任务,它可以帮助你深入理解Spring的设计原理、实现机制以及最佳实践。

weijiasihai的专栏 856

别再搞混了!MATLAB通信仿真中EbN0转SNR的保姆级公式推导与避坑指南

本文深入解析MATLAB通信仿真中EbN0与SNR转换的核心公式,揭示数字仿真与理论系统的关键差异。通过真实案例展示错误参数设置导致的隐蔽问题,并提供完整的参数自查清单和正确实现代码,帮助工程师和学生避免常见错误,确保仿真结果准确可靠。

weixin_28746223的博客 348

飞书多维表格+影刀RPA:我如何用3个指令搞定每周的销售数据自动汇总(附完整配置截图)

本文详细介绍了如何利用飞书多维表格和影刀RPA实现销售数据的自动化汇总,通过三个核心指令(建立链接、列出记录、更新记录)简化繁琐的手工操作。文章包含完整的配置截图和实战指南,帮助用户快速部署自动化流程,提升工作效率。

weixin_29273849的博客 286

spring源码学习

一、先跟着博客一路debug下去。 期间可能会跟丢,但是请反复地debug下去(过程可能很痛苦,但是源码这关是绕不开的),能跟上博客,大致知道做了什么。 要懂得利用idea编译器debug时的drop frame功能,如果用的是idea的话。 推荐博客:Jintao_Ma的博客 Spring源码浅析 二、看《spring揭秘》 当跟着博客debug一段时间,有些懵懂的认识之后。再看《spring揭秘》就会有种豁然开朗的感觉。一定要debug之后,再看这本书,不然就会...

tanghuan0827的博客 664

避坑指南:在Ubuntu 20.04上从零部署IS-Fusion环境(含CUDA 11.1和PyTorch 1.10.1配置)

本文提供了在Ubuntu 20.04系统上从零部署IS-Fusion 3D目标检测环境的详细避坑指南。内容涵盖CUDA 11.1、PyTorch 1.10.1、spconv等核心组件的精确版本安装与兼容性配置,并指导如何准备nuScenes数据集及启动模型训练,旨在帮助研究者和开发者高效搭建稳定的多模态融合算法开发环境。

gitlab7runner的博客 553

Spring 源码学习资料 从手写到源码深度剖析

通过这套 Spring 源码学习资料,大家可以从基础到高级,系统地学习 Spring 框架的核心技术和实现原理。无论是手写代码还是深入源码,这些资料都将帮助大家更好地理解和使用 Spring 框架,提升开发效率和代码质量。如果你对 Spring 源码感兴趣,或者想深入了解 Spring 框架的实现原理,这套资料绝对值得一学!希望这些资料能够帮助你在 Spring 学习的道路上更进一步。

运维老生常谈 3444

2024年数字IC秋招-格科微-数字电路设计工程师-笔试题

笔试题型:简答题(9个)笔试平台:牛客(电脑监控)笔试时间:2h。

qq_42135020的博客 1605

信奥赛C++提高组csp-s之数论基础专题课:从同余到分数模运算1(知识地图:同余、裴蜀定理、扩展欧几里得、乘法逆元、分数模运算)

信奥赛C++提高组csp-s之数论基础专题课:从同余到分数模运算1(知识地图:同余、裴蜀定理、扩展欧几里得、乘法逆元、分数模运算)

王老师青少年编程 792

关于Spring源码学习 这里是一些建议

在学习过程中,不断实践和总结,提高自己的编程能力和对Spring框架的理解。最后,请记住不要把学习Spring源码当作单纯的记忆工作,而是要思考这些代码的设计思想和底层原理。只有通过不断学习和实践,你才能真正掌握Spring框架的精髓。

大道至简 762

基于半经验模型的熔断器燃弧过程计算与分析

本文针对1200V/1250A熔断器建立电弧燃烧半经验模型,通过ANSYS计算弧前时间,结合熔体烧蚀、石英砂烧蚀等物理过程简化建模。模型引入电导率随温度变化函数,利用Matlab拟合实验数据确定参数。分析表明:熔体宽度和节距增加会提高弧压峰值并缩短过零时间;总长固定时,断口数和节距影响较小。弧压峰值需控制在额定电压3倍内,过零时间需满足安全裕度。通过Python代码复现了电弧电导率模型、能量平衡方程及弧压计算,验证了熔体结构尺寸对电弧特性的影响规律。

huanghm88的专栏 261

spring5源码的学习

SpringIOC源码学习

qq_20156289的博客 157

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

一 spring源码学习准备

学习spring的重要性 1.spring重新定义了java 2.提升自己的写代码的能力 3.从全局考虑如何使代码变得灵活和可扩展 4.如果想成为真正的高手,spring源码必须攻克。 spring的历史 2002年10月,Rod Johnson发布《Expert One-on-One J2EE设计和开发》一书 2004年03月,Spring1.0发布 2006年10月,Spring2.0发布 2009年12月,Spring3.0发布 2013年12月,Spring4.0发布 2017年09月,Spring

d495435207的博客 250

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

1、Spring 源码学习-准备

文章目录前言该走的路是一定要走的源码下载 还是 IDE 看 jar 包?方法论建议一:掌握基础的 UML 知识和工具建议二:积累常见的英文术语建议三:用好关键字查询,看看别人怎么说建议四:带着问题学习组件:Component 前言 体能状态先于精神状态,习惯先于决心,聚集先于喜好 该走的路是一定要走的 作为一名 Java 开发实践者,研究学习 Spring 源码是必不可少的环节。 这里笔者的...

༺ bestcxx的专栏 ༻ 578

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Spring源码学习笔记

Spring框架源码学习流程图剖析:

weixin_43248672的博客 186

Spring源码学习总结

最近工作不是很忙,抽时间又把spring源码学习了一下,再次总结一下。  技术上的提升  之前一直是单纯的应用,现在花费了一段时间把spring的源码亲自实现了一遍,宏观上了解了spring架构的设计。比如容器的懒加载、beanfactory的设计、xml序列化、类的划分、beanfactory的抽象等等,让自己以后在用spring的时候,能够很清晰,而不至于在像以前那样只是单纯的应用功能。  学

1922

Spring源码学习入门记录

前言 最近想要学习一下Spring,总感觉没有学一下Spring的源码,就不知道Spring究竟在帮我们做什么事。【有些坑还是要踩踩比较好!!】 踩坑开始: 作为一个从没看过源码,又没怎么做过项目的人,自然不知道所谓的看Spring的源码究竟是啥,入门在哪,路线是啥(大神请自动跳过渣渣的学习路程,没啥好看的),于是本是看源码的目的,我想咱们得有源码先呀,于是就去问问度娘,怎么下...

Masli的博客 716

Spring源码的学习方法和知识地图

目的意义Spring对于Java工程师的重要地位可参考语文、数学在小学课程里地位。当然啊,学不好也不是不行。说这个又不得不提我老公。人家凭借自己是东北人,比我这个山东人高考少一百多分。相当于一科没考嘛!人家不也工作的挺好嘛。老公为了向我体现实力说:那年数学特别难,自己考了100(满分150)呢。我无奈的摇摇头:我考了130多。工作了,咱们终于摆脱了地域上的歧视。渐渐淡忘不...

xiexiaojing的博客 1920

Spring源码学习的准备阶段

最近在学习有关Spring框架相关的知识 心血来潮,突然想写点什么东西,就以最近学习的Spring框架的过程开始吧,万事开头难。 学习Spring的准备阶段 简单分享下我学习前的准备阶段: Spring源码:强烈建议大家自己去搭建一套Spring环境,这样做的好处是可以写注释,不清楚的地方可以重点标记下(好像也只有这个好处吧…)。 一本书:Spring源码深度解析(第二版),想要学明白,这本书必不可少。 制作图表:利用processOn画出Spring源码的流程图,这个很重要,不要以为当时源码看明白就理解

依痕梦的博客 211

spring源码 学习方法

一、需储备的基础知识 (1) 设计模式 (2) 数据结构 算法 (3)反射 (4)多线程 (5)JVM 二、注意事项 (1) 不要专注细节 (2) 看注释(接口、类、方法) (3) 见名知意 (4) 大胆猜测、小心验证 (5) 画图(时序图、结构图、总结图) (6) 坚持 三、源码按自己的节奏,每天学一点就可以,不要和其...

tedfdndg的博客 1524
下一篇: Freemark自定义标签,调用java静态方法
傲慢的小蜗牛
博客等级 码龄15年 0粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值