大家好,我是 IoC 容器家族的第 17 代传人,我们家族世世代代在 spring 商业街上卖烤面筋,大家都叫我“面筋哥”,另外我爹还给我起了个高大上的英文名字,叫“FileSystemXmlApplicationContext”,但有群臭猴子嫌麻烦,就天天叫我的外号,害得我差点忘了自己的本名。不过无所谓咯,只要生意兴隆,这都是小事。
前几天出摊卖烤面筋时,灵感大作,即兴唱了一首“我的烤面筋”,被网友拍下来传到某站上 成了网红,现在我要趁势而上,把自己祖传的烤面筋工艺宣传出去,让我那个臭弟弟“ClassPathXmlApplicationContext”知道,谁才是 IoC 容器的正统传人!
作为一名初入职场的开发者,最开始是在逛 B 站刷视频时看到的一个 Spring 源码阅读解析,当时作为一个只知道 SSH 和 CRUD 的 boy,看完后心里就两个词儿“卧槽!牛B啊!”而且在去年秋招面试阿里时几乎每次都会被面试官问道“有阅读过什么开源框架吗?”每次我都只能一脸便秘的“嗯…,呃…,啊…,木得…”。这在我心里埋下了一个想法,硬着头皮也要把 Spring 框架源码读一遍,再不济也要看看猪是怎么跑的。
学习方法的话,我个人比较喜欢先在 B 站上看相关视频,知道怎么读,从哪下口。然后自己买了本 计文柯老师的《Spring 技术内幕》,比对着从 Spring 官网下载的源码包潜心研读。第一遍读,什么都不懂,按图索骥,迷迷糊糊的读完了;第二遍读,就轻车熟路一些咯,“卧槽!原来如此!”的感叹声也络绎不绝;第三遍就能够在整体代码设计和细节实现两个不同的层次上去吸收 Spring 框架的优点咯。
这三个月来,阅读 Spring 源码给我带来的提升,主要在专业技能上,但同时也辐射到了我的工作、学习、社交等方面。所以,写这篇文章一方面是应“码农翻身”专栏——刘欣老师的建议,做个经验谈,另一方面也是对自己这三个月学习成果的总结。
我所从事的行业做的是toB 的业务,产品底层平台的框架,代码累累,堆积成山,很多框架都是零几年写的,有的甚至比 Spring 还早。且最近国产化、中台、云服务等概念都在不断落地中,有框架源码的阅读经验,让我能够更从容地面对公司研发的新框架,所维护的产品适配华为高斯数据库时,也更清楚可能是JDBC框架中哪里做了特殊处理所导致的问题。当然,最主要的还是对个人编码规范的养成,设计模式的理解应用,英文阅读的能力提升。
作为一个初入职场的开发者,编码规范是一个很重要的点,能够让你写出的代码易于维护、阅读和理解。比如,Spring框架虽然类图体系复杂丰富,但对于类、方法、参数等的命名非常规范;注释注解也非常严谨,注重格式,不会偷懒;对于异常和日志的处理也具有很好的参考价值。比如,之前产品中有遇到一个“将业务表单中的小数从科学计数法转换成普通计数法”(数值过大的Double类型数字默认会以科学记数法显示,这是用户无法接受的),研读了复杂的业务代码之后,发现填充到表单前的数据都是Object类型的,且丢失了原本类型,无法通过instanceof判断应该转成String还是Double,这让我和我的师傅都有点头疼,但 Spring 源码中有过一段以异常捕获机制处理逻辑代码的片段让我灵光乍现,于是我直接将Object强转成Double并使其不做科学记数法的处理,并将这段代码try住,如果没抛异常,就转换成了Double,抛了异常,就在catch中强转成String。
从 IoC 的各顶层接口到中间一层一层的抽象类,再到最后的实现类,这一整套体系的设计和实现,对自己在日常工作中设计某些功能的接口、抽象类和具体实现,都带来了很有价值的参考,设计模式和巧妙的编码技巧也渐渐变得触手可及。比如,设计一个 VO 字段校验功能时,会先定义一个顶层接口,抽象出公共方法,抽象类中有做必输项字段非空校验的,在其中利用模板方法模式对公共功能做具体实现,特性化功能写成抽象方法交由各子类具体实现即可。
Spring 上很多接口和抽象类,其注解甚至比代码还多,我也经常尝试着去阅读理解这些注释,看看自己的理解与书上的差异,用这种方式来提升英文技术文档的阅读能力,往往更实在一些。
虽然是做技术的,但我也是一个很爱出去耍的人。构建好自己的学习模式能够让你更从容地面对工作和生活。不加班的情况下(所幸部门加班并不太多),我一般会在晚饭之后以及周日时间充电。不管是学技术还是其它什么东西,我认为 以视频为入口,以业界公认的名书继续深入理解,以社交圈的同行或网上社区为输出交流管道,最后持久化到思维导图及学习文档中。Spring 源码学习是我工作之后对自己学习模式构建的一个尝试,构建起这种学习模式之后,个人的工作和生活也变得更加协调平衡,不至于在繁杂忙碌的工作中渐渐丧失学习能力。另外一个比较重要的就是,看 Spring 源码时经常能看到一些与公司框架有异曲同工之妙的编码技巧及实现,比如异常的批量抛出,ConcurrentHashMap 初始化其容量,ThreadLocal 的使用等等,这些都是在读 Spring 源码之前很少会注意或使用的。
对于初级开发者学习 Spring 源码来说,我建议配合阿里的《Java 开发手册》一起看,因为编码能力和框架设计能力是需要很长时间的经验积累才能得到大幅提升的,而编码规范则是我们最开始就能做到并做好的事情,也是很多成熟公司越来越重视的东西。另外,阿里的《Java 开发手册》中不少规范都是参考了 Spring 框架的,这也从侧面体现了 Spring 作为业界知名框架,其编码的规范性是深受认可的。