一起学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…

基于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…

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

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

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

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

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

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

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

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

Python3 列表

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

飞腾uboot命令简单介绍

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

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

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

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

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

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

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

市值暴跌后,每日优鲜能否靠2亿融资“续命”?

濒临破产退市的每日优鲜,靠转型实现“自救”? 作为“生鲜电商第一股”,每日优鲜在上市1年后爆发生存危机。 8月4日,每日优鲜(NDAQ:MF)公布了2022年报,尽管去年7月其宣布关闭营收占比约90%的DWM业务,全面终…

【80天学习完《深入理解计算机系统》】第十一天 3.5 过程(函数调用)

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录)   文章字体风格: 红色文字表示&#…

RK3568 安卓源码编译

一.repo安卓编译工具 项目模块化/组件化之后各模块也作为独立的 Git 仓库从主项目里剥离了出去,各模块各自管理自己的版本。Android源码引用了很多开源项目,每一个子项目都是一个Git仓库,每个Git仓库都有很多分支版本,为了方便统…

gradio使用transformer模块demo介绍2:Images Computer Vision

文章目录 图像分类 Image Classification图像分割 Image Segmentation图像风格变换 Image Transformation with AnimeGAN3D模型 3D models 图像分类 Image Classification import gradio as gr import torch import requests from torchvision import transformsmodel torch.…

【Unity3D赛车游戏】【六】如何在Unity中为汽车添加发动机和手动挡变速?

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:Uni…

【【STM32分析IO该设置什么模式的问题】】

STM32分析IO该设置什么模式的问题 我们分析而言 我们对于PA0 的设计就从此而来 对于边沿触发的选择我们已经有所了解了 我们下拉,但是当我们摁下开关的时候 从0到1 导通了 所以这个是下拉 上升沿触发 而对于KEY0 我们摁下是使得电路从原来悬空高阻态到地就是0 所以…