Spring框架源码分析一
如何看源码(方法论)
不要忽略源码中的注释
使用翻译工具
先梳理脉络,然后梳理细节即总分总,先总体过一遍,再看细节,再做一个总结
大胆猜测(8分靠猜),小心验证,再调整思路
坚持、坚持、坚持
遇到不会的,先迈过去,先不处理
坦白说看源码就是为了工作或为了技能的提升,被迫做这样的事情;
一定要掌握技巧,刚开始会很痛苦,在收获成就感之后才会慢慢产生兴趣,有了兴趣,再坚持就容易很多。
Spring IOC和AOP
原来想使用某一个对象,必须自己去new,现在spring帮我们管理和创建这些对象,这些过程不需要我们去做了,如果要用直接从容器中拿可以了。
spring创建对象大致思路(粗粒度)
看源码之前先理思路,先从spring xml方式创建对象开始,

id class是指我们要创建的那些bean对象,
第一步先读取配置文件,把它加载到当前应用程序里面去,
第二步通过解析知道有什么样的属性值、属性名称,
把这些信息都解析完成之后,再创建实例即一个具体的对象,创建出来之后,就可以直接使用了,使用完之后,还有一个销毁的过程。
再从粗粒度中拆分出一些具体细节的点
Spring里面有IOC (控制反转) 和AOP,容器是用来存放bean对象的,那用什么样的数据结构来存?
可以用list、set、map,这三个最大的区别是存取值的方式不一样,
在整个容器里面会存放n多对象,在后面使用的时候,根据一些描述来取出具体的一个值,这个时候就意味着我要根据名字来取出具体value值,所以它最终存储的是k-v格式的数据,这时候只能用map结构存储。
当把这些前置知识都搞明白了,再来细化具体的过程,spring到底是如何进行架构设计的?
当new一个对象的时候或通过其他方式创建对象的时候,才能存储到IOC容器中,存完之后,后面才能取。
这里面会涉及到创建对象的方式,创建对象有几种方式:
第一个是new
第二个是反射
在这些基础之上可以利用一些设计模式,比如用工厂模式创建对象,但不管什么样的方式,最终是要创建对象的。
创建对象的时候要思考另外一个非常核心的点,你创建出来的对象是一个通用的?还是每次都是新的?
spring bean默认的scope作用域是单例的,当然可以指定protype,但是一般情况下没有做特殊指定的话默认就是单例的,也可以指定request或session。
因为每次都new一个新的就不是一个单例对象了,所以spring就放弃了new的方式创建对象。
那反射怎么写代码
1、第一步先获取一个Class clazz=class.forName();
参数是类名.class或对象名.getClass
2、生成具体的对象
Constructor ctor= clazz.getDeclareConstructor()获取构造器,当有了构造器之后,Object obj=ctor.newInstance就可以返回一个具体对象了。
bean的描述信息或定义信息(名字、哪个class、有哪些property) 都会进行相关的存储,当这些东西都定义好之后,容器就可以启动了:
第一步先进行相关的加载,加载完之后进行一个相关的解析工作。
把它对应的一些描述信息(bean的定义信息)转换成一个具体的对象,因此定义一个接口叫BeanDefinition来表示bean的定义信息。
原来的时候是在注解或xml文件里面配置,现在加载到当前容器里面去了。
springboot用的yaml或property配置文件,属于另外一个类型的配置文件了,哪怕是json里面也可以定义bean的描述信息,只要对json进行解析就可以了。
不同的文件需要进行不同的解析工作,中间要进行一个抽象层,抽象存在的意义是定义一些相关的规范或者定义一些相关的方法,由对应的方法来完成具体的解析工作 ,那么再由具体的实现子类去进行相关的一个实现就可以了。
解析xml文件,定义一个xml的读取类;解析json文件,定义一个json的读取类;新的配置文件,依然可以定义新的实现类进行相关的读取和解析工作,这个读取的抽象类就是BeanDefinitionReader,专门用来完成读取的工作。
当还需要一些其他的配置文件的时候,只需要创建具体的子类实现这个接口进行解析就可以了,解析完之后,有一个统一的出口都放到BeanDefinition中去,就相当于提前做了一个抽象,这层抽象来完成具体对应的一个功能,此时已经有了bean的定义信息了,下一步就要把当前这个bean进行一些实例化工作,

通过这种方式可以获取到一个具体的bean对象,当我在获取bean对象的时候,是直接从当前容器里面拿的,拿的前提是一定要有。
想获取都一个完整的对象,一般包含2部分操作,第一部分叫实例化,还有一个叫初始化,实例化在堆中开辟一块空间,属性都是默认值;初始化是给属性赋值,赋值完之后已经变成一个完整对象了,就可以直接拿过来使用了。给属性赋值的操作也分为2个操作,第一个叫填充属性,另外一个叫执行初始化方法。

python中的__new__表示创建了对象,但是属性没有赋任何值,__init 完成了赋值操作;
java中没有明确的这样的一个划分,所以它包含两部分,第一个是填充属性,就表示说调用set方法给属性填充值,当把具体的一个属性填充完成之后,可以调用一个方法叫init-method,执行这个属性指定的方法里面具体实现的一个逻辑。

bean对象里面这样使用init-method和destroy-method。
实例化后下面的某个环节应该包含初始化操作,当对应的初始化完成了之后,获取到一个最终的完整对象,有了完整对象之后就可以进行一个相关的使用了。
spirng是一个框架,除了框架之外还有一点叫生态,springboot或springcloud都是在spirng基础之上演变过来的 或扩展出来的,所以在设计spring源码的时候要注意一件事情,要考虑一个非常主要的点叫扩展性,只有扩展性设计好了,后面才能随意发挥。spring框架在在整个生态里面代表的是基石或叫底层支撑。
相关文章:
Spring框架源码分析一
如何看源码(方法论)不要忽略源码中的注释使用翻译工具先梳理脉络,然后梳理细节即总分总,先总体过一遍,再看细节,再做一个总结大胆猜测(8分靠猜),小心验证,再调…...
CSS常用内容总结(扫盲)
文章目录前言相关概念【了解】脚本语言什么是脚本语言脚本语言有什么特点常见的脚本语言什么是动态语言,什么是静态语言动态语言和静态语言两者之间有何区别CSSCSS是什么CSS的特点一、CSS代码怎么写基本语法规则引入方式内部样式内联样式表外部样式代码风格二、CSS的…...
Java启蒙之语言基础
目录 一.Java标识符和关键字 1.1Java标识符 1.2Java关键字 二.数据类型和变量的概述和关系 2.1Java变量 2.2Java的数据类型 2.2.1数据类型的分类的概述 2.2.2数据类型的转换 3.Java运算符 总结 😽个人主页:tq02的博客_CSDN博客-领域博主 &#…...
数据库系统--T-SQL数据查询功能-多表查询(超详细/设计/实验/作业/练习)
目录课程名:数据库系统内容/作用:设计/实验/作业/练习学习:T-SQL数据查询功能-多表查询一、前言二、环境与设备三、内容四、内容练习题目:对应题目答案:五、总结课程名:数据库系统 内容/作用:设…...
Spring Boot 3.0系列【14】核心特性篇之Configuration相关注解汇总介绍
有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot版本3.0.3 源码地址:https://gitee.com/pearl-organization/study-spring-boot3 文章目录 前言@Configuration@ConfigurationProperties@EnableConfigurationProperties@ConfigurationPropertiesScan@Configuratio…...
[ubuntu][jetson]给jetson增加swap空间类似于给windows加虚拟内存
具体操作如下: #打开性能模式 sudo nvpmodel -m 0 && sudo jetson_clocks #增加swap空间,防止爆内存 swapoff -a sudo fallocate -l 15G /swapfile sudo chmod 600 /var/swapfile sudo mkswap /swapfile sudo swapon /swapfile…...
小黑子—Java从入门到入土过程:第二章
Java零基础入门2.0Java系列第二章1. 注释和关键字2. 字面量3. 变量3.1 基本用法3.2 使用方式3.3 注意事项4. 变量练习5. 计算机中的数据存储5.1 计算机的存储规则5.2 进制5.3 进制间转换二进制转十八进制转十十六进制转十十进制转其他进制6. 数据类型7. 定义变量的练习8. 标识符…...
ElasticSearch搜索详细讲解与操作
全文检索基础 全文检索流程 流程: #mermaid-svg-7Eg2qFEl06PIEAxZ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-7Eg2qFEl06PIEAxZ .error-icon{fill:#552222;}#mermaid-svg-7Eg2qFEl06PIEAxZ .error…...
web实现太极八卦图、旋转动画、定位、角度、坐标、html、css、JavaScript、animation
文章目录前言1、html部分2、css部分3、JavaScript部分4、微信小程序演示前言 哈哈 1、html部分 <div class"great_ultimate_eight_diagrams_box"><div class"eight_diagrams_box"><div class"eight_diagrams"><div class&…...
【LeetCode】33. 搜索旋转排序数组、1290. 二进制链表转整数
作者:小卢 专栏:《Leetcode》 喜欢的话:世间因为少年的挺身而出,而更加瑰丽。 ——《人民日报》 目录 33. 搜索旋转排序数组 1290. 二进制链表转整数 33. 搜索旋转排序数组 33. 搜索旋转排序…...
IBM Semeru Windows 下的安装 JDK 17
要搞清楚下载那个版本,请参考文章:来聊聊 OpenJDK 和 JVM 虚拟机下载地址semeru 有认证版和非认证版,主要是因为和 OpenJ9 的关系和操作系统的关系而使用不同的许可证罢了,本质代码是一样的。在 Windows 下没有认证版,…...
Lambda表达式和steram流
目录 引言: 语法: Lambda 表达式实例: demo演示: Stream流: 引言: Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。 Lambda 允许把函数作为一个方法的参数(函…...
面试必会-MySQL篇
1. Mysql查询语句的书写顺序Select [distinct ] <字段名称>from 表1 [ <join类型> join 表2 on <join条件> ]where <where条件>group by <字段>having <having条件>order by <排序字段>limit <起始偏移量,行数>2. Mysql查询语…...
Hadoop入门常见面试题与集群时间同步操作
目录 一,常用端口号 Hadoop3.x : Hadoop2.x: 二,常用配置文件: Hadoop3.x: Hadoop2.x: 集群时间同步: 时间服务器配置(必须root用户): (1)…...
JS 数组去重的方法
// 数组去重 const arr ["1", "1", "2", "3", "5", "3", "1", "5", "4"] console.log(this.deduplicate(arr)) // [1, 2, 3, 5, 4] // 数组对象去重 const arr [ { id: 1, nam…...
PMP项目管理项目沟通管理
目录1 项目沟通管理2 规划沟通管理3 管理沟通4 监督沟通1 项目沟通管理 项目沟通管理包括通过开发工件,以及执行用于有效交换信息的各种活动,来确保项目及其相关方的信息需求得以满足的各个过程。项目沟通管理由两个部分组成:第一部分是制定…...
2.JVM常识之 运行时数据区
1.JVM核心组成 2.JVM 运行时数据区(jdk8) 程序计数器:线程私有,当前线程所执行字节码的行号指示器 jvm栈:线程私有,Java 虚拟机栈为 JVM 执行 Java 方法服务 本地方法栈:线程私有,本…...
你的游戏帐号是如何被盗的
据报道,2022上半年,中国游戏市场用户规模达到了5.54亿人,游戏市场销售收入1163.1亿元,相较去年均为同比增长的情况。如此庞大的市场规模,黑色产业链是绕不开的话题。 但相较于游戏中大家常见的玩家与玩家、玩家与官方…...
C++11异步编程
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言1、std::future和std::shared_future1.1 std:future1.2 std::shared_future2、std::async3、std::promise4、std::packaged_task前言 C11提供了异步操作相关的类…...
20230310----重返学习-DOM元素的操作-时间对象-定时器
day-024-twenty-four-20230310-DOM元素的操作-时间对象-定时器 复习 获取元素 id document.getElementById() 类名 document.getElementsByClassName() 标签名 document.getElementsByTagName() name属性 document.getElementsByName() 选择器 document.querySelector()docum…...
Claude Code本地安装与配置国产智谱模型 (保姆级教程)
目录 一、安装 二、验证安装完整性 三、绕过区域限制协议 1. 创建专属启动脚本 2. 配置系统环境变量 3. 通过脚本启动 四、配置国产智普模型 今天给大家带来一期非常实用的 AI 工具部署教程。作为开发者,善用 AI 工具能极大提升我们的日常编码和解决问题的效…...
车载Java OTA升级崩溃率从18.7%降至0.3%:基于Delta Patch + 类隔离热修复的4步标准化流程
第一章:车载Java OTA升级崩溃率从18.7%降至0.3%:基于Delta Patch 类隔离热修复的4步标准化流程在车载嵌入式Java环境(JVM 11,ART兼容层)中,OTA升级引发的ClassCastException与NoClassDefFoundError曾导致高…...
**元宇宙经济中的智能合约开发实战:用Solidity构建去中心化资产交易系统**在元宇宙经济蓬勃发展的今
元宇宙经济中的智能合约开发实战:用Solidity构建去中心化资产交易系统 在元宇宙经济蓬勃发展的今天,数字资产的流通与确权成为核心议题。无论是虚拟土地、NFT艺术品还是游戏道具,背后都离不开区块链技术的支持。而智能合约正是连接现实世界资…...
pdfsizeopt如何实现PDF文件无损压缩?3大行业案例与高级技巧全解析
pdfsizeopt如何实现PDF文件无损压缩?3大行业案例与高级技巧全解析 【免费下载链接】pdfsizeopt PDF file size optimizer 项目地址: https://gitcode.com/gh_mirrors/pd/pdfsizeopt 在数字化办公环境中,PDF文件已成为信息传递的标准格式ÿ…...
安规设计规范-3(如何计算电气间隙和爬电距离)
详尽的计算方式建议参考各个标准的要求,本文只指出常规的基础计算流程。以下示例严格遵循 GB/T 16935.1-2023/IEC 60664-1:2020《低压系统内设备的绝缘配合》,选用储能 PCS(储能变流器)最常见的230V AC 电网侧对低压控制侧场景&am…...
告别手动操作!Open-AutoGLM部署教程,让AI接管你的手机
告别手动操作!Open-AutoGLM部署教程,让AI接管你的手机 1. 引言:AI手机助手的革命性突破 想象一下这样的场景:早上醒来,你只需要对手机说"帮我点一杯星巴克燕麦拿铁,加双份浓缩,送到公司&…...
3GPP TS 23.256标准解读:无人机广播远程识别码(Broadcast Remote ID)到底是怎么工作的?
3GPP TS 23.256标准深度解析:无人机广播远程识别码的技术实现与合规路径 当一架无人机在城市上空盘旋时,地面人员如何快速确认它的合法身份?监管机构又该如何在密集的无线电环境中精准捕捉每一架飞行器的信息?这些问题的答案&…...
[具身智能-190]:具身智能常见的仿真平台与常见的模型算法,包括传统算法与AI算法。
在具身智能的开发中,仿真平台与模型算法是相辅相成的两个核心部分。仿真平台为算法提供了安全、高效、低成本的“练兵场”,而算法则是赋予机器人智能的“大脑”。以下为你梳理当前主流的仿真平台以及两类核心的模型算法:传统算法与AI算法。&a…...
抖音视频批量下载高效解决方案实战指南
抖音视频批量下载高效解决方案实战指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support. 抖音批量下载工具&…...
提示工程代码审查避坑指南:10个容易犯的低级错误
提示工程代码审查避坑指南:10个容易犯的低级错误 引言:为什么提示工程需要“代码审查”? 在AI时代,提示词(Prompt)是人类与大语言模型(LLM)沟通的“桥梁”。就像程序员写代码需要评审…...
