一起学SF框架系列附-Springframework源码学习总结

学习过程

学习Springframework6.0.8,前后将近4个月终于结束了。学习主要内容如图(红框):
在这里插入图片描述

本次学习主要针对核心模块:Beans、Context、Core、SpEL(完全独立于框架的,没深入学习)、AOP,以SF应用的初始化过程为轴线,较深入了解了Spring的核心技术dependency injection, events, resources, i18n, validation, data binding, type conversion, SpEL, AOP。

学习方法总结

1、采用应用跟踪方法为主,即编写最简单应用,然后以应用容器ClassPathApplicationContext初始化为起点,跟踪初始化全过程:容器初始化、加载资源、加载Bean定义及Bean初始化;同时把初始化过程同各个技术结合点入手,跟进具体技术如何实现。个人认为这种方法最有效的特点就是实现和结果印证,有助于对框架的理解。
2、学习过程中仅仅看源码是远远不够,还需要到做如下几点:
2.1 用UML工具画类关系图,这样才容易建立相关点的整体印象。
2.2 画关键过程的时序图,有助于清晰执行过程及跳转关系。
2.3 做笔记,可以文档形式或博客形式。特别是源码逐行注释非常有助于理解框架。
2.4 反复阅读,并反复修正2.1-2.3所做的事。
2.5 坚持:开始阶段读源码会非常难受,不停的跳转好像进入了迷宫,这时只有坚持才能解决。

Springframework认识总结

1、Springframework发展到6.0.8,系统复杂性很高,从类个数可见一般:
Beans: 313个类
Context: 517个类
Core: 634个类
SpEL: 110个类
AOP: 203个类

2、Spring提供了依赖导致能力,其框架本身也是坚持依赖导致:接口先行。其具体好处如下:
2.1 接口先行,是框架提供扩展能力的基础机制。扩展不可使应用介入或使用展框能力,同时支持扩展框架本身。
2.2 标记接口使用:标记接口指接口没有任何方法,仅代表某类抽象程度很高的事情。如Aware接口就是典型标记接口,代表应用可以感知(获取)应用某一个方法的能力(如ApplicationContextAware、EnvironmentAware、ResourceLoaderAware、MessageSourceAware…)
2.3 接口解决多继承问题:如应用容器(ApplicationContext)作为应用运行的环境,需要包括很多不同的东西,通过接口就可以统一起来,见下图:
在这里插入图片描述

3、类继承层次深:层次5个以上是常见的,超过9个(含接口)也不罕见。这样的优点是非常符合OOD原则,易于修改和扩展;缺点是程序复杂性大大提高。常见阅读障碍是:继承层次中间某一个方法的实现是抽象的或空方法体,具体实现在子孙类中,这时需要手工去找这个实现方法体。例图如下:
在这里插入图片描述

4、Spring提供的扩展机制,框架本身也是用这个进行扩展。如Bean实例化和初始化过程有很多扩展点,不仅应用可利用这些扩展点利用框架能力,而且框架本身就是这样使用的,如解析BeanDefinition实现中,标准命名空间(bean)解析是默认的,非标准命名空间(如context、aop等)是定制入口,不同元素入口对应不同的解析实现,例如context:annotation-config和context:component-scan对应不同的实现,前者对应解析器AnnotationConfigBeanDefinitionParser,后者对应解析器ComponentScanBeanDefinitionParser。这样优点当然是非常优雅的实现了扩展机制,难点程序可读性下降很多,阅读者如果不通过跟踪调试方式,甚至找不到正确的解析器。例图如下:
在这里插入图片描述

学习收获

通过系统阅读框架源码,提升了如下方面的能力:
1、解决应用问题能力:随着对框架认识加深,提高了对基于框架的应用问题的解决能力。
2、提升设计能力:学习框架实现,探究背后的设计原因,可提升自己对应用系统设计和重构能力。
3、学习优秀的编码风格:基本上所有的类、属性、方法均有注释,其中接口注释更详细。所有注释均符合JavaDoc规范。
4、学习优秀的框架,可以扩大阅读者技术眼界,直观体验业界大牛是如何解决问题的。

至此,本次学习就算结束了。虽然这次学习基本搞懂了Springframework是如何实现的,但由于个人精力有限,加之框架的复杂性,导致泛泛阅读的源码大约只有一半,精读可能只有四分之一;对于源码理解的正确性、准确性也不能保证100%,不得不说这是不小的遗憾。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/56113.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL 实战(一):实现“附近的人”功能

❤️ 个人主页:水滴技术 🚀 支持水滴:点赞👍 收藏⭐ 留言💬 🌸 订阅专栏:MySQL 教程:从入门到精通 文章目录 ST_Distance_Sphere 函数示例一:计算北京站到北京西站的距…

【深度学习】实验03 特征处理

文章目录 特征处理标准化归一化正则化 特征处理 标准化 # 导入标准化库 from sklearn.preprocessing import StandardScalerfrom matplotlib import gridspec import numpy as np import matplotlib.pyplot as plt import warnings warnings.filterwarnings("ignore&quo…

aws PinPoint发附件demo

php 版aws PinPoint发附件demo Laravel8框架,安装了"aws/aws-sdk-php": "^3.257" 主要代码: public function sendRawMail(Request $request) {$file $request->file(attachment);/*echo count($file);dd($file);*/$filenam…

Mobx在非react组件中修改数据,在ts/js中修改数据实现响应式更新

我们都之前在封装mobx作为数据存储的时候,使用到了useContext作为包裹,将store变成了一个hooks使用,封装代码: import React from react import UserInfo from ./user import Setting from ./seting import NoteStore from ./noteclass Stor…

定时产生不同频率方波

/*----------------------------------------------- 内容&#xff1a;通过定时产生不同频率方波 ------------------------------------------------*/ #include<reg52.h> //包含头文件&#xff0c;一般情况不需要改动&#xff0c;头文件包含特殊功能寄存器的定义 /*-…

基于Jenkins构建生产CICD环境(第三篇)

目录 基于Jenkins自动打包并部署docker环境 1、安装docker-ce 2、阿里云镜像加速器 3、构建tomcat 基础镜像 4、构建一个Maven项目 基于Jenkins自动化部署PHP环境 基于rsync部署 基于Jenkins自动打包并部署docker环境 1、安装docker-ce 在192.168.2.123 机器上&#x…

【linux命令讲解大全】007.现代技术中的差异比较工具——diff

文章目录 diff补充说明语法选项参数实例以正常模式比较差异 从零学 python diff 比较给定的两个文件的不同 补充说明 diff命令在最简单的情况下&#xff0c;用于比较给定的两个文件的不同。如果使用 “-” 代替 “文件” 参数&#xff0c;则要比较的内容将来自标准输入。dif…

Qt——Qt 开发中所涉及的所有控件(基本控件、容器控件、布局控件、高级控件、其他控件、多媒体控件、定制控件)

Qt 开发中所涉及的所有控件 一、基本控件 二、容器控件 三、布局控件 四、高级控件 五、其他控件 六、多媒体控件 七、定制控件 Qt开发中提供了许多控件&#xff08;Widgets&#xff09;供开发者使用&#xff0c;用于构建图形用户界面&#xff08;GUI&#xff09;应用程序。以…

Go 第三方库引起的线上问题、如何在线线上环境进行调试定位问题以及golang开发中各种问题精华整理总结

Go 第三方库引起的线上问题、如何在线线上环境进行调试定位问题以及golang开发中各种问题精华整理总结。 01 前言 在使用 Go 语言进行 Web 开发时&#xff0c;我们往往会选择一些优秀的库来简化 HTTP 请求的处理。其中&#xff0c;go-resty 是一个被广泛使用的 HTTP 客户端。…

React Diff算法原理

文章目录 前言Diff算法原理 前言 &#x1f449;点此&#xff08;想要了解Diff算法&#xff09; Diff算法原理 React Diff算法是React用于更新虚拟DOM树的一种算法。它通过比较新旧虚拟DOM树的差异&#xff0c;然后只对有差异的部分进行更新&#xff0c;从而提高性能。 Reac…

如何有效进行RLHF的数据标注?

编者按&#xff1a;随着大语言模型在自然语言处理领域的广泛应用&#xff0c;如何从人类反馈进行强化学习&#xff08;RLHF&#xff09;已成为一个重要的技术挑战。并且RLHF需要大量高质量的人工数据标注&#xff0c;这是一个非常费力的过程。 本文作者在数据标注领域具有丰富经…

JWT工具类,SpringBoot整合Jwt使用

引入依赖 <!-- JWT依赖 --><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></dependency><!-- JWT相关依赖&#xff0c;jdk1.8以上版本还需引入以下依赖 --&…

解决jupyter notebook可以使用pytorch而Pycharm不能使用pytorch的问题

之前我是用的这个目录下的Python 开始更新目录 1、 2、 3、

使用Python内置模块加速SQL查询

大家好&#xff0c;假设你正在查阅一本书的页面&#xff0c;你想要更快地找到你正在寻找的信息。那么你可能会查找术语索引&#xff0c;然后跳转到引用特定术语的页面&#xff0c;SQL中的索引与书籍中的索引工作原理类似。 在大多数实际系统中&#xff0c;都将对包含大量行的数…

【javaweb】学习日记Day6 - Mysql 数据库 DDL DML

之前学习过的SQL语句笔记总结戳这里→【数据库原理与应用 - 第六章】T-SQL 在SQL Server的使用_Roye_ack的博客-CSDN博客 目录 一、概述 1、如何安装及配置路径Mysql&#xff1f; 2、SQL分类 二、DDL 数据定义 1、数据库操作 2、IDEA内置数据库使用 &#xff08;1&…

Python3 列表

Python3 列表 序列是 Python 中最基本的数据结构。 序列中的每个值都有对应的位置值&#xff0c;称之为索引&#xff0c;第一个索引是 0&#xff0c;第二个索引是 1&#xff0c;依此类推。 Python 有 6 个序列的内置类型&#xff0c;但最常见的是列表和元组。 列表都可以进…

飞腾uboot命令简单介绍

飞腾uboot和开源uboot并无大差异,故飞腾uboot固件命令可以直接从网上搜索开源uboot相关命令。 这里为了便于大家调试,将一些可能用到的命令说明一下。 在 Uboot 命令行下,输入 help 将打印所有的可用命令,复杂命令操作,通过命令 help 的方式获取具体说明。 1.help命令 …

时序预测 | MATLAB实现DBN-SVM深度置信网络结合支持向量机时间序列预测(多指标评价)

时序预测 | MATLAB实现DBN-SVM深度置信网络结合支持向量机时间序列预测(多指标评价) 目录 时序预测 | MATLAB实现DBN-SVM深度置信网络结合支持向量机时间序列预测(多指标评价)效果一览基本描述程序设计参考资料 效果一览 基本描述 MATLAB实现DBN-SVM深度置信网络结合支持向量机…

校招算法题实在不会做,有没有关系?

文章目录 前言一、校招二、时间复杂度1、单层循环2、双层循环 三、空间复杂度四、数据结构五、校招算法题实在不会做&#xff0c;有没有关系&#xff1f;六、英雄算法集训 前言 英雄算法联盟八月集训 已经接近尾声&#xff0c;九月算法集训将于 09月01日 正式开始&#xff0c;目…

.NET 8 Preview 7 中的 ASP.NET Core 更新

作者&#xff1a;Daniel Roth 排版&#xff1a;Alan Wang .NET 8 Preview 7 现在已经发布&#xff0c;其中包括了对 ASP.NET Core 的许多重要更新。 以下是预览版本中新增功能的摘要&#xff1a; 服务器和中间件 防伪中间件 API 编写 最小 API 的防伪集成 Native AOT 请求委托…