我今年41岁,使用Java开发将近20年了,目前还在技术一线。
虽然我是科班出身,但其实十多年走过来,无论是Java语言本身,还是相伴的工具和框架都发生了巨大变化。而我自己也是一路学习新技能,一路丢弃旧知识。
而今天回头看,也发现自己走了很多弯路,浪费了不少时间,很是遗憾!
但是,因为你是自学,面临巨大的入行压力,因此就不该付出太高的试错成本。而应该寻找一条有重点的,高效的学习方法。否则一不小心,很有可能倒在入行的门口,前功尽弃。
但好在Java学习,总的来说还是重点突出、难点分明的,也确实存在一条高效的学习路径。
过去半年,我不断的盘整自己的思路,陆续写了几篇文章,来分享我对高效学习Java的看法。但不足之处是,这些文章都分散在不同的回答下。因此,今天刚好趁此机会,我把它们整理起来,希望对你的学习有帮助。
1.Java学习的重点是什么?
从大学到现在,我使用Java已经将近20年,日常也带实习生,还在公司内部做training,所以可以分享下我的经验,希望对你有用。
因为是在工作中培训,就必然有两个约束:实用、时间紧,因此就不能像大学那样,把所有的知识点都面面俱到的讲到。而只能挑基础的,实用的,难理解的讲。至于其他边边角角的知识,就一笔带过。一则没有时间,二则不常用,再则既使讲了,学生印象也不深刻。总之一句话:“好钢用在刀刃上”。
下面,就根据我的实践,具体谈下学习过程:
1.基础知识
我学习java的时候,先是通读了《Java编程思想》,然后是《Java核心技术》。当时这两本书还不像现在这么厚,而刚才我把案头的《Java核心技术》第9版翻了翻,上下两册已经1700多页了,可想而知,如果要把它通读一遍,且不说把所有的代码都调通,就是当小说读,估计也需要些时间。
但我现在教学依然首推《Java核心技术》,主要是体系完整,实例多,可操作性强。但对初学者,我一般是只讲前6章,也就是下面的内容:
- Java程序设计概述
- Java程序设计环境
- Java的基础程序设计结构
- 对象与类
- 继承
- 接口与内部类
就《Java核心技术》第9版来说,也就是到250页为止,加把劲,1个月拿下完全没问题。
因为你是自学,所以建议你一定要把其中的代码都调通,课后的作业尽量去做。除此之外,还有两点特别重要:
#.学习笔记
因为你是自学,不像在企业中学了就能够实践,印象自然特别深刻。而自学因为没有实践的及时反馈,所以记笔记就显得特别重要。因为记笔记就像写作一样,是整理思路的绝佳方法。同时学习笔记也是你以后开发,面试的绝好资料。
学习编程,人跟人是不一样的,别人觉得难理解的东西,对你却不一定;而你觉得难理解的东西,别人可能又会觉得特简单。而学习笔记就是自己专有的“难点手册”,有点像高考时的“错题本”,以后无论是在面试前,还是在日常工作中,随时都可以翻出来看看,自是获益匪浅。
#.分门别类保存demo
学习笔记是很好的文字资料,但编程界有句话说的特别好,所谓“no code, no text”,意思就是说:千言万语都没有一段代码来的实在。
以我的经验,在你在学习的过程中,就某个知识点,无论当时理解的多透彻,调试的多棒,只要时间一长,等到了实用的时候,肯定会碰到各种各样的问题,一些看似简单的东西,此时死活就是调不通,正所谓人到事中迷。这个时候,如果你手头恰有运行良好的demo,打开参考一下(甚至直接拷贝过来),问题自然迎刃而解。而且因为这些demo都是你亲手调试出来,印象自然特别深刻,一碰到问题,在脑子中自会立刻涌现。
所以说,在学习的过程,一定要善待你调通的demo,千万不要用完了就扔,等后来碰到困难,想要用时却找不到,追愧莫及。正确的做法就是把所有调通的demo,分门别类的保存起来,到时候查起来自是得心应手。
这是我自己创建的java学习交流qun:六一五,七四一,六三六,这里聚集了一帮热爱学习java的人,如果你也在学习java,苦于一个交流分享的圈子,欢迎你的加入。
人都说“书到用时方恨少”,其实代码也是这样,所谓“demo用时方恨少”。
2.Spring
目前在Java EE开发中,Spring已经成为和Java核心库一样的基础设施,所以说如果想成为一个合格的Java程序员,Spring肯定绕不开。另一方面,如果掌握了Spring体系,Java基本上就算入门了,就有能力进行一些实用级的开发了。
但Spring本身也是日渐复杂,衍生项目越来越多,但最最核心的概念依旧是IOC和AOP,掌握了这两个概念,再把Spring MVC学会,再学习其他的衍生项目就会平滑很多。
同时,因为Spring本身就应用了许多优雅的设计理念,所以学习Spring的过程,也是加强Java基础知识学习的过程。因此等你掌握了Spring,原来很多你理解不透彻的Java特性,此时就会恍然大悟,包括接口、抽象类等。
我学习Spring,读的第一本书是《Spring实战》,坦率的说,书很一般,但市面上比它好的书,我却没有遇到过。还有一本《Spring源码深度解析》也不错,对Spring的设计理念讲的尤其透彻,虽然整本书读起来有些艰涩,但前几章却生动有趣,也是整本书的精华。所以建议你在学习Spring之前,先把该书的前几章通读一下,然后再回过头来学习《Spring实战》会顺利很多。
以我经验,要学透Spring,终极的方法还是阅读源码(我当时就是这么干的),待把Spring的核心源码通读了,人就真的自由了(所谓无真相不自由),不仅是对Spring,而是对整个Java体系。以后再遇到其他框架,大概一眼就能看出其中的脉络,所谓到了“看山不是山”的境界。但这都是后话,可以作为以后你努力的方向。
和学习Java基础知识一样,学习Spring也一定要记笔记,一定要分门别类保存demo。老实说,Spring对初学者不算简单,因此最好能有个好老师带一下,不用太长时间,2个课时即可,然后就是在你遇到大的困难时,能及时的点拨下。
以我的经验,要初步掌握Spring,大概需要1到1个半月的时间。
3.其他知识
Spring是Java编程的基础设施,但真要进入到实际项目的开发,还有些东西绕不过,包括 MySql,Mybatis,Redis,Servlet等,但如果你经过Spring的洗礼,这些东西相对就简单多了,以我的经验,1个月的时间足够了。
4.实践
学习Java,光学不练肯定是不行的。但因为是自学,所以就没有实际的产品让你练手,但也没有关系,谁大学还没有做过毕业设计呢?以我的经验,大家最爱的“学生管理系统”依旧是个很好的练手系统。
别看“学生管理系统”逻辑简单,但麻雀虽小五脏俱全,其中数据库设计、Mybatis,Spring、SpringMVC,Servlet、Tomcat一个都不缺,绝对的练手好伴侣。
还有,虽然你的学习重点在Java,因为要做一个完整的demo,前端的配合肯定少不了。因此就免少不了要学一些简单的JS、HTML知识,但因为前端本就是个很大的topic,所以一定要控制好边界,千万不要顾此失彼。就“学生管理系统”来说,在前端上,只要实现一个包含table、textbox、button,能发送REST请求到server,能实现学生的“增删改查”的简单页面即可。
作为一个练手项目,目标就是把Java的主要技能点串起来,所以自不求尽善尽美(也不可能),所以1个月时间足够了。
最后
按照上面的过程,4个月的时间刚刚好。当然Java的体系是很庞大的,还有很多更高级的技能需要掌握,但不要着急,这些完全可以放到以后工作中边用别学。
学习编程就是一个由混沌到有序的过程,所以你在学习过程中,如果一时碰到理解不了的知识点,大可不必沮丧,更不要气馁,这都是正常的不能再正常的事情了,不过是“人同此心,心同此理”的暂时而已。
在日常的教学中,我常把下面这句话送给学员们,今天也把它送给你:
“道路是曲折的,前途是光明的!”
祝你好运!
2.哪些Java知识没必要学习了
我接触 Java已近20年了,见证了许多Java技术变迁,包括:
JavaEE框架,从百家混战到现在Spring基本一统天下。
Web开发,从标配的SSH到现在SpirngMVC + MyBatis组合。
IDE,从当年如火如荼的JBuilder到Eclipse,再到更好用的IDEA。
我判断的依据主要有以下几点:
- 实际开发能否用到?
- 是否有助于加深对技术的理解?
- 对面试是否有用?
JSP
JSP在实际开发中,主要是作为MVC模型中的V(View)层出现的。当然,View层的渲染技术除了JSP,还有FreeMaker、Velocity等。
JSP作为页面模板,在后端通过MVC框架渲染成HMTL,然后再发送到客户端(例如浏览器)来呈现。这也就是我们常说的“前后端不分离”,“混合式”开发。
而当前,包括我所在的公司,以及大部分互联网公司。要么已经抛弃这种模式,要么正在抛弃的路上,而转向彻底的“前后端分离”。
在“前后端分离”模式下,后端只负责提供服务接口(例如REST),而前端(例如HTML5)通过接口发送/获取,呈现数据(例如JSON格式)。
这样,在后端,原来的MVC框架,某种意义上已经演变为MC框架。因此,与V(View)相关的一切模板技术都失去了学习的必要,其中当然也包括JSP。所以,后来的Java学习者,我的建议是:
“完全可以放弃对JSP的学习。”
Struts
在Java后端开发中,MVC模型还是主流。而Struts作为一个MVC框架,单从技术上来说,还是很优秀的。
但是,现在Spring实在是太强势了,越来越成为Java开发中的“一站式”工具包,其中的一个利器就是Spring MVC。
望名知意,Spring MVC也是一个MVC框架。而且因为它是Spring的亲儿子,自然和Spring契合的非常完美。
同时,在设计之初,Spring MVC就参照了其他MVC框架的优缺点(包括Struts),所以用起来非常爽。因此,在MVC框架领域,Spring MVC大有一统天下的趋势。
因此现在,很多公司,老的Struts项目还在维护。但新的项目开发,更多转向了Spring MVC。因此,如果你是Java新手,正在学习中,我的建议是:
“不要再学习Struts了,从Spring MVC开始吧!”
Hibernate
Hibernate作为老牌的OR映射框架,功能非常强大,涵盖面非常广。但这既是它的优点,同时也成为它的“负担”,是开发人员“不能承受之重”。
Hibernate的设计初衷,是为了最大程度的解放程序员,完全隔离数据库,实现彻底的OR映射。程序员甚至可以不写一行SQL语句,单通过配置就能实现对数据库的操作。
当然,为了实现这个目标,Hibernate也设计的非常复杂、非常精巧。就不可避免的带来以下副作用:
- 学习成本高
- 配置复杂
- 调优困难
前两点不难理解,单说“调优困难”。
因为Hibernate的设计目标是彻底的OR映射,彻底的隔离SQL语句。但必然会带来一定的性能损失。大部分情况下,应用如果对性能不敏感,Hibernate也没问题。但应用一旦对性能敏感,有SQL级别调优的需求,Hibernate的优点反而成为缺点。
虽然Hibernate也支持SQL级别的调优,但因为框架设计的过于复杂和精巧,这就需要开发人员对Hibernate理解的非常透彻,这就带来了更高的学习成本。
而现在最流行的MyBatis,作为一个“混合式”,轻量级OR映射框架,既继承了Hibernate的优点,同时也吸取了他的教训。在支持配置的同时,又能接触SQL,从而带来了更多灵活性(包括调试、优化)。
当前,在实际开发中,Hibernate使用的越来越少了。大家更偏爱MyBatis这种轻量级框架。所以,对后来学习者,我的建议是:
“不需要再学习Hibernate了,学MyBatis就够了。”
Servlet(要精通)
当然,现在不会有任何公司,再用纯粹的Servlet来时实现整个Web应用,而是转向一些更高级的技术(例如各种MVC框架)。因此,会给人一种错觉:Servlet已经过时,后来者就不需要再学习了。
在这里,我可以非常负责任的说:这种观点是极端错误,极端不负责任的。
Servlet不仅要学,而且要学深,学透。
当前,Servlet虽然不再是一个主流web开发技术,但依然是Java Web开发技术的基础,是Java Web容器的基石,是行业标准。而现在流行的各种MVC框架(包括SpringMVC),在最底层,还是以 Servlet为基础的。
为此,我画了一个简单的图(不准确,会意即可):
所以,如果你想要彻底掌握某个MVC框架,则必须彻底理解Servlet。
而且,Servlet作为一个基础设施。精通它,不仅有助于理解各种MVC框架。即使Servlet本身,也有很多实用价值。
如果你深刻理解了Servlet的生命周期,就可以在底层做很多事情。譬如在Request进来的时候,进行拦截,进行权限的判定。也可以在Response发出的时候,进行拦截,统一检查、统一附加。
所以,如果你正在学习Java,对Servlet,我的建议是:
“Servlet不仅要学,而且要学深,学透。”
其他
目前在国内,Java更多是作为web后端技术出现的。因此在实际学习中,很多技术就不符合“国情”,学习的现实意义不大。下面我就简单列举下。
1.Applet
作为页面插件技术,不用多说,连flash都快被淘汰了,更无论从未流行的applet。
2.Swing
作为桌面UI框架。且不说本身设计的咋样。现实开发中,我接触的桌面应用,要么用C++(例如MFC),要么用C#(Winform、WPF)。所以,Swing就没有学习的必要了。
3.JDBC
作为较低层的数据库基础设施,JDBC被很多框架(例如MyBatis)支持。但在实际开发中,程序员即使不了解也无大碍。因此,虽然我不能建议你放弃JDBC学习,但如果你时间有限,完全可以把它的优先级排低一点。
4.XML
XML现在还在广泛应用。但作为一个web数据传输格式,正在逐渐被JSON替代。所以,对Java后端学习来说,XML简单了解即可。至于庞杂的XML操作API(例如XPath),完全不必学习。将来真要用到,再查也不迟。
3.非科班程序员如何补充基础知识
非科班程序员,入了行,该如何继续提升自己?
我是科班出身,大学也算努力,系统的掌握了计算机知识。迄今为止,也工作了将近20年。但老实说,无论是从在实际开发中,还是个人成长,回头看,大学学习的很多课程,其中有很多,要么“用处”不大,要么完全可以换个方式,更高效的学习。
其中的原因,一方面是实际开发更关注知识的“实用”,另一方面,我们的大学教学也确实与产业有点脱钩。
因此,本文,我就从实用出发,简单介绍下那些领域的知识有很大的学习必要性,以及如何有重点的学习。
数据结构
毫无疑问,数据结构对一名程序员来说非常重要,不是有句话说“程序 = 数据结构 + 算法”。从某个角度看,这种说法即使现在依然成立。这也说明数据结构的重要性。
但大部分的数据结构课程,关注的重点都在如何从数学上实现一个数据结构(例如堆栈、链表)。这从研究上来说,没有错。
但在实际开发中,大部分主流语言(例如Java、C#)都已经内置了常用数据结构。而且即使没有内置的,我们也常可以在第三方库中找到现成的实现。而且这些实现,大都经过实践检验,无论是稳定性还是性能都有保证。
也就是说,对大部分程序员来说,在实际开发中,很难有需求从头实现一个数据结构。因此,就完全没必要像科班生那样,从数学源头来学习数据结构,而只需做到下面几点:
- 熟悉常用数据结构的概念(例如数组、堆栈、链表、Map等)。
- 了解常用数据结构不同实现的差异(例如ArrayList和LinkList的差异)。
- 关注常用数据结构的外围算法(例如如何对List和Map进行查找)。
- 关注数据结构使用中容易出错的地方(例如是否线程是否安全等)。
- …
当然也完全没必要阅读大部头的著作,而只需了解关注的重点是什么,然后再到网上搜索专题文章学习即可。至于关注的重点,可以参考《xxx面试大全》中的数据结构章节。
算法
这个要具体问题具体分析了。以我接触的领域来说,大部分普通的业务系统都不会涉及到太复杂的算法,因此就没必要专门在算法上投入时间。
但在一些特殊的领域,如果算法跟不上,可能“寸步难行”,例如图形处理领域,无论是图像的变化还是增强,无一例外都要用到矩阵变换,因此就必然涉及到线性代数的内容,顺藤摸瓜,往纵深学,就必然会牵出更多的东西。
因此,对非科班生(尤其是数学不够好的),对算法学习我是持“劝退”态度的。因为,从职业发展来说,这实在是一条太“曲折”的路线。
一方面,目前的开发越来越趋专业化,算法一般由专门的算法团队负责,普通软件工程师只负责算法转换。
以我为例,虽然是科班出身,也系统的学习过算法,但也常有力有不逮的时候。复杂的算法既实现不了,甚至是理解不了。很多时候,我干脆就不做实现,直接请算法工程师告诉我思路,甚至是伪代码,而我负责转化为正式代码(例如Java)。实践证明,这种做法不仅是可行的,而且也是高效的,正所谓“术业有专攻”。
另一方面,人的精力是有限的,你完全可以把精力投入到自己更擅长的方面,例如设计、产品、架构上,从而取得“差异化”的成功。
当然,如果你“心气”很高,一定要在算法上有所作为,我也可以推荐你两本书:
- 《算法导论》
- 《数学之美》
这些都是我读过,受益良深的作品。
设计模式
设计模式,我认为是初中级程序员,向高级程序员提升的关键点。
在实践中,我见过太多程序员,前期冲劲十足,但后继乏力,最终泯然于众生。我不敢说所有的人如此,但有不少都是吃了设计模式的亏。
在工作的前几年,大部分程序员都是处于熟悉语言层面的阶段,也就是处于“技”的阶段。这个阶段,如果人还算靠谱,大概在2到3年就会过去,接下来就要进入“术”的阶段。在编程领域,“术”的最典型代表就是“设计模式”。因此,设计模式的重要性再怎么强调都不为过。
要学习设计模式,最经典的读物依然是GOF的《设计模式:可复用面向对象软件的基础》,精炼、深刻,没有一句废话。但这本书对初学者来说,读起来太艰涩,一方面是作者极度追求语言的凝练,一方面代码是用C++描述的。因此,我推荐大家阅读《Head First设计模式》,生动有趣,而且是用Java描述的。
但是,如果精力允许,我还是建议你一定要把GOF的《设计模式:可复用面向对象软件的基础》阅读一下,而且要不止一遍的读(我就是)。这本书绝对常读常新。
当然,学习设计模式,不仅要读书,更要从实践中学习。例如学习Spring框架的过程,如果你有思考,就会发现其中有太多设计模式可供借鉴。
学习设计模式,就是从实践到理论,然后再从理论到实践,反复实践,反复思索,反复总结的过程。当然,这也是从一个“码农”转变成“工程师”的过程。
软件工程
实现一个软件系统的过程,不仅只有编码。还涉及到项目安排,团队协调等一系列非技术因素。而作为一名程序员,如果想往上更进一步,独当一面,成为team leader或者开发经理等管理职务。则软件工程一定要跟上。
当然,软件工程这么多年也一直在进步,从原来的瀑布开发,到现在流行的敏捷开发,但无论怎么变,有些经典的东西还是不变的。下面我就推荐几本我认为现在依然值得深读的书:
- 《人月神话》
- 《人件》
- 《Scrum敏捷软件开发》
当然,关于软件工程,最好的学习方法依然是观察。观察你所在的团队、所在的公司是如何处理工程问题,然后思索,阅读,最终形成自己的方法观。
架构 & 设计
写出一个好程序,有几个维度,从下到上,也是一个程序员逐步升级的过程。
第一阶段,首先要保证基本功扎实,最简单的说,要做到语法熟练、基本框架熟练,成为一个功夫精熟的“码农”。
第二阶段,从“技”到“术”,从“码农”到“工程师”。这个阶段的关键技术是设计模式。在局部上,不仅追求实现功能,更关注实现的好,关注功能之外的维度,例如健壮性、低耦合、可扩展等指标。对主流框架(例如Spring),不仅会用,更有深刻的理解。
第三阶段,从“术”到“道”。
这个阶段,不仅在局部上追求一个模块的好坏,而且还要从整个系统层面去掌控程序,例如保证整个程序不出现系统腐败,如何安排资源的优先级等。这个时候就不是单一的维度,单一的技术能够保证了。
经常有朋友问我是如何成为一名架构师的,很难用一句话来回答。
我可以路线鲜明教你如何成为一名优秀的软件工程师,但至于如何成为一名架构师,我想除了努力,运气肯定也很重要。但无论如何,有机遇,不是还得有准备嘛?
作为一名架构师,所靠的肯定不是单一的维度,也不是但靠纯粹的读书能获得的。但就我来说,有些经典书的阅读,确实给我日常的工作带来了巨大的帮助,下面我就推荐给你:
- 《代码大全》、
- 《重构:改善既有代码的设计》
- 《设计原本》
- 《大型网站技术架构核心原理与案例分析》
作为一名程序员,从技术菜鸟到大拿的路径有很多,其中最核心的因素就是坚持和努力。学习的过程,就好像登山的过程,以我的经验,大概有80%的人在攀登的过程中,会因为这样那样的原因而掉队。
但无论如何,我相信,只要目标明确,努力加坚持,即使是一个非科班生,也完全可以登顶。
4.Java学习的一些补充建议
关于Spring Boot
Spring Boot是目前学习和应用的热点,所以就有不少人说:“Spring和Spring MVC已经过时,不需要再学习了”。
在我看来,上面的观点是极端错误和不负责任的。
从设计目标来说,Spring Boot只是实现了Spring的自动化配置,降低了项目搭建的复杂度。
从技术上说,Spring Boot的底层依然是Spring的核心机制,包括IOC、AOP,以及实现者 – Spring容器。所以,Spring Boot作为一个承载者。如果承载的是web项目,Spring MVC该怎么工作,还是怎么工作。
与“传统”程序不同,Spring应用主要通过配置、注解,然后由Spring容器统一装配运行。因此,如果程序员不能对底层机理做到“了然于胸”,则对整个系统的运行逻辑必然是“云里雾里”。
因此,在实际项目中,Spring系统一旦出了问题,许多“半吊子”程序员就会感到不知所措。为了快速“解决”问题。只得在Spring配置上胡乱折腾。所以到最后,很多Spring程序(包括业界著名公司)都被改的面目全非,腐败不堪,充斥着各种冗余和冲突。
而Spring Boot虽然简化了Spring配置,但同时也使程序离Spring本质越来越远。整个程序的运行逻辑更加“云里雾里”。一旦出了问题,更加令人不知所措。
所以,从程序的健康出发,从程序员的职业发展出发。Spring Boot的开发者,反而更有必要掌握Spring的底层原理,正所谓“无真相不自由”。
而且,以我的经验。如果你扎扎实实从Spring基础一路走来,到了Spring Boot这里,也就是“临门一脚”的问题。因此,学习Spring,最“正”的路径依然如下:
Spring -> Servlet -> Spring MVC -> Spring Boot
JPA与Hibernate
JPA作为一个持久化规范,仅定义了OR映射的规范(包括一系列注解),但本身并没有具体的实现。
在实际应用中,JPA的具体实现既有Hibernate,也可以通过spring和把jpa和Mybatis结合起来。但因为Hibernate的高可配性,因此从概念设计上来说, Hibernate对JPA的实现显得更加“自然”。
但是,无论是业界还是我本人,偏爱Mybatis的原因和JPA关系不大,关键是因为Hibernate相对不够灵活,从而带来的高学习成本和调优成本。
当然,毫无疑问,Hibernate是一个非常优秀的框架。至于你所在的团队是否选择它,肯定是综合考量的结果。其中既包括团队的技术现状(例如是否有Hibernate大牛),也包括项目的规模,及灵活性需求等。
而在其他文章中,我对Hibernate的观点,主要是针对高效学习来讲的,毕竟人的精力是有限的。
关于大数据
前面的两篇文章,面向的主要是Java web开发者。
当然,Java开发,除了Web,还有大数据等方向。虽然都是学习Java,但内容肯定有所偏重。这里我就简单阐述下,以免对其他方向(例如大数据)的学习者有所误导。
做大数据开发,无论是做Hadoop的Map Reducer,还是Storm的topology(拓扑),最常见的实现方式还是Java。从这一点来说,对Java基础知识的学习,大家都是一样的。
但差别在是否要学习Spring?这决定于你对自己的定位!
如果你把仅自己定位在数据处理上,只需编写Map Reducer或topology,那么你完全可以不学习Spring。
但是,一个完整的大数据系统,必然是一个综合系统。其中包括系统配置、数据的收集、传输、存储、展示等子系统。而如何把这些子系统整合成一个综合系统,则是Spring的专长,这也是JavaEE面临的核心问题。
因此,从系统开发角度来说,大数据开发者依然应该学习Spring。只不过从优先级上来说,完全可以把Spring往后排一下。
5.如何阅读Spring源码
因为Spring的源代码量非常大。如果像阅读小说一样,一行不拉的读,是不现实的。所以,现实,而且有用的做法,是只阅读核心代码。
至于其他边支代码,如果通读,一则不现实,二则没有必要。
但因为Spring复杂,且设计精妙。初学者刚开始阅读,必然会面比较茫然,不知从那里入手。而我的做法,有一下几个关键点:
1.先掌握Spring的基本用法。
在阅读Spring源码之前,首先要掌握Spring的基本用法,否则就找不到基本的出发点。
此时,你肯定不能完全理解Srping的运行机制。但随着使用的熟练,一则积累了经验,二则肯定也会有很多疑问。这不要紧,反而是好事。
随着学习的深入。你要有自己思考:如果某个机制(例如IOC),由你来设计,该会如何实现?
2.写几个典型的Spring Demo
因为你的目的是阅读Spring源码。所以如果一开始,就阅读相对高阶的SrpingMVC,需要理解的东西太多,必然会茫然不知所措。
因为起始难度太大,缺乏正反馈。对很多人,甚至是直接就吓退了。
所以,准备几个好的Demo,这些Demo一定要层层深入,从而作为自己阅读源码的出发点。
在内部培训中,我写过一个教程,名叫《Spring从入门到精通》,该教程总共包含5个Demo,由浅入深的顺序如下:
- 基本Java程序示例(SimpleJavaDemo)
- 基本Spring示例(SimpleSpringDemo)
- Spring自动织入示例(AutoWiredSpringDemo)
- Spring自动扫描示例(AutoScanSpringDemo)
- SpringMVC示例(SpringMVCDemo)
大家可以根据个人的情况,也编写出自己的Demo库。
3.边调试,边阅读
例如对下面这行最普通的Spring代码:
直接用Maven下载源码,然后在Eclipse中Debug进去。此时,就像你平时阅读同事的源码一样。带着疑问,带着猜测。阅读的过程,边验证,边调整,总重形成体系的思路。
记着,因为Spring源码复杂,且继承体系深,所以一定要边阅读,边记笔记,边画图。例如下面就是我画过的一个图(从Eclise中截取):
很重要的一点。在阅读Spring源码前,一定要先有自己的想法:如果这个东西(例如经典的getBean()方法)由你要设计,会怎么做。然后带着想法,跟(debug)进去。不断验证,不断调整。
4.不需面面俱到,只抓重点。
因为Spring源码巨大。对阅读者来说,也不是都有价值,所以一定要抓住重点。
要时刻记住阅读的初心:不是为了阅读而阅读,而是为了深刻理解Spring,从而自由运用,所谓“无真相不自由”。所以只阅读核心的,对自己有用的(这个因人而异)。下面是我当年阅读时的读书笔记提纲,贴出来供大家参考:
5.Spring阅读的收益
通过阅读Spring源码,至少能有以下收获:
#.精通Java
因为 Spirng框架本身,就是对Java最“精妙”的运用。我敢保证,在阅读Spring的过程,除了发现很多Java的“新”特性外。你也能学会“大神”们,是如何正确且高效的编写Java程序。
#.学习设计
Spring框架本身就是一个“设计良好”的典型,其中大量运用到经典的设计模式,例如“观察者模式”、“单例模式”等。因此学习Spring的过程,就是学习设计的过程。
#.深刻理解Spring用法
所谓“无真相自由”。等你学习了Spring源码后。我敢保证,你回头再来看自己,或别人原来写的Spring程序,肯定会发现诸多“错误”。包括代码的冗余,冲突等。
.最后
如果你是一个初学者。刚开始阅读Spring源码,一定会感觉特别困难。因为其中涉及太多新东西。但这正说明,Spring源码是一个宝库。
咬咬牙,扛过去,你的技术层次就会跃上一个新的台阶,甚至是质的飞跃,所谓:
“会当凌绝顶,一览众山小。”