00 spring源码剖析系列说明

spring可以说是在web1.0时代java最流行的ssh框架(Struts,Spring,Hibernate) 中三元老的一员,追溯历史也有20年之久了。
而时至今日只有spring框架以及衍生的项目的开源社区还非常活跃,而且spring框架已经成为企业级 java web项目的标准框架。在其基础上衍生的springboot项目和springcloud更是最近几年非常火爆的web框架。废话不多说,如果想在java技术栈企业级开发走的更深更远,spring源码的阅读和理解是必不可少的一环。

但是spring的知识又是非常庞杂的。盘根错节的功能依赖,犬牙交错接口的调用让即使在web开发多年的老司机在遇到稍微深入一点的spring问题时,如果没有源码阅读经验也很难全身而退!对于小白来说如果遇到问题更是一头雾水。对于老司机和小白来说,源码的阅读都是必不可少的。

博主认为源码阅读无外乎有两种方式:

  • 横向死磕,new 一个ClassPathXmlApplicationContext对象,一行一行的刷代码,debug代码一步一步的走,博主曾经这样尝试过。刷的过程中非常的痛苦,需要极大的耐心和毅力。刷完后没有和业务相结合导致学完了无的放矢,最后投入大量时间,产出比却非常的低。

  • 纵向死磕,spring中帮我们实现了很多功能,拿DI和AOP这两个核心功能来说其每个功能点的实现又可以拆分好多小功能点的实现。比如DI的实现:需要spring能读取classpath中的xml文件或者扫描加载指定包中的特定注解类、需要解决Bean的循环依赖问题、需要解决Bean生命周期管理问题等等,而这些问题还可以继续拆分。拿Bean的循环依赖问题来举例,spring创建Bean的方式有xml文件配置和注解配置两种,Bean1依赖的Bean2的注入方式也有构造器注入和Setter方法注入两种,Setter方法注入的Bean也有@Resource和@Autowired两种方式,Bean1依赖的Bean2和Bean1的类型可能是同一个类型也可能是不同的类型。具体化一个case来说就是spring是如何解决基于@Autowired注解的Setter方法Bean注入(注入的Bean和被注入的Bean类型不同)的循环依赖问题的?我们可以把这个特别具化的case通过阅读源码来解决。而通过源码了解这一个case的运作原理的过程中,我们会多多少少的了解spring其它部分的代码。通过多个具化case的纵向分析,潜移默化的情况下就会对spring有一个整体的把我和了解。但是纵向死磕也有个问题,面对spring庞杂的代码海洋,小白要想找到其具化case相关的代码就如大海捞针一样,最后相关的核心代码没有找到,自己却被淹个半死。

看博主对两种源码阅读方法的着墨程度,也可以知道博主比较推荐第二种 纵向死磕 的方式。而本系列文章的目的就是做读者在spring源码这片汪洋大海中航行的灯塔——指明具化case的相关代码所在,同时对其做必要的分析。在此我想说下阅读过程中的一些小经验:

  1. 源码阅读要多debug,多思考。显而易见的道理,但也是最重要的原则。
  2. 源码阅读要“心无旁骛”。本系列的每篇文章会针对一个很具化的case做相关源码的分析。在这个过程中难免会涉及到一些不相关的代码,比如源码中某类的A方法的第189行代码到200行代码和一个具化的case相关,读者就不要在A方法的前189行代码做过多研究。spring源码枝繁叶茂,稍微偏离一点主干就会迷失在代码海洋中。可能有读者会有这样的疑惑,不仔细看前189行代码,能理解的了189行到200行代码的意思吗?这个大可放心,对代码的抽离过程由博主给读者做,保证大家能彻彻底底的了解一个具化case的相关源码。通过多个具化case源码的分析,你会不经意间发现,A方法的全部作用你都了解了。
  3. 做难事必有所得。最近在看金一南教授的《苦难辉煌》,感觉其中最让我深刻明白的一个道理就是:做难事必有所得。希望大家在阅读过程中有困难时咬咬牙坚持下来,最后一定会有所收获。

最后,博主也不是spring大神,系列文章难免有瑕疵和纰漏,希望和积极留言讨论,愿诸君共同进步。本系列文章中使用的代码全是构建在maven项目中,项目也比较简单,其依赖的maven坐标如下:

1
2
3
4
5
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.1.RELEASE</version>
</dependency>

系列文章建议的学习顺序如下:

1、spring解决循环源码分析


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 lmyuanwork@163.com

文章标题:00 spring源码剖析系列说明

本文作者:aworker

发布时间:2020-05-07, 16:46:13

最后更新:2020-05-17, 15:26:24

原始链接:http://aworker.cn/2020/05/07/java/spring/post0/post0/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏