对于自学Java的人来说,如何系统的,全方面的学习Java?

Java自学路线图之Java系统自学 文章目录第一阶段 Java零基础自学路线图--Java基础自学第二阶段 Java零基础自学路线图--Java语言进阶第三阶段 Java零基础自学路线图--JavaWeb自学第四阶段 Java零基础自学路线图--第一部分框架第五阶段 Java零基础自学路线图--第二部分框架Java自学资源 Java自学不是一朝一夕的事情。可以采用“懒开始”的方法,但是必须要坚持下去,才能真正自学Java掌握编程技... 阅读详情

我今年41岁,使用Java开发将近20年了,目前还在技术一线。

虽然我是科班出身,但其实十多年走过来,无论是Java语言本身,还是相伴的工具和框架都发生了巨大变化。而我自己也是一路学习新技能,一路丢弃旧知识。

而今天回头看,也发现自己走了很多弯路,浪费了不少时间,很是遗憾!

但是,因为你是自学,面临巨大的入行压力,因此就不该付出太高的试错成本。而应该寻找一条有重点的,高效的学习方法。否则一不小心,很有可能倒在入行的门口,前功尽弃。

但好在Java学习,总的来说还是重点突出、难点分明的,也确实存在一条高效的学习路径。

过去半年,我不断的盘整自己的思路,陆续写了几篇文章,来分享我对高效学习Java的看法。但不足之处是,这些文章都分散在不同的回答下。因此,今天刚好趁此机会,我把它们整理起来,希望对你的学习有帮助。

1.Java学习的重点是什么?

从大学到现在,我使用Java已经将近20年,日常也带实习生,还在公司内部做training,所以可以分享下我的经验,希望对你有用。

因为是在工作中培训,就必然有两个约束:实用、时间紧,因此就不能像大学那样,把所有的知识点都面面俱到的讲到。而只能挑基础的,实用的,难理解的讲。至于其他边边角角的知识,就一笔带过。一则没有时间,二则不常用,再则既使讲了,学生印象也不深刻。总之一句话:“好钢用在刀刃上”。

下面,就根据我的实践,具体谈下学习过程:

1.基础知识

我学习java的时候,先是通读了《Java编程思想》,然后是《Java核心技术》。当时这两本书还不像现在这么厚,而刚才我把案头的《Java核心技术》第9版翻了翻,上下两册已经1700多页了,可想而知,如果要把它通读一遍,且不说把所有的代码都调通,就是当小说读,估计也需要些时间。

但我现在教学依然首推《Java核心技术》,主要是体系完整,实例多,可操作性强。但对初学者,我一般是只讲前6章,也就是下面的内容:

  1. Java程序设计概述
  2. Java程序设计环境
  3. Java的基础程序设计结构
  4. 对象与类
  5. 继承
  6. 接口与内部类

就《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也设计的非常复杂、非常精巧。就不可避免的带来以下副作用:

  1. 学习成本高
  2. 配置复杂
  3. 调优困难

前两点不难理解,单说“调优困难”。

因为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为基础的。

为此,我画了一个简单的图(不准确,会意即可):

对于自学Java的人来说,如何系统的,全方面的学习Java?

所以,如果你想要彻底掌握某个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#)都已经内置了常用数据结构。而且即使没有内置的,我们也常可以在第三方库中找到现成的实现。而且这些实现,大都经过实践检验,无论是稳定性还是性能都有保证。

也就是说,对大部分程序员来说,在实际开发中,很难有需求从头实现一个数据结构。因此,就完全没必要像科班生那样,从数学源头来学习数据结构,而只需做到下面几点:

  1. 熟悉常用数据结构的概念(例如数组、堆栈、链表、Map等)。
  2. 了解常用数据结构不同实现的差异(例如ArrayList和LinkList的差异)。
  3. 关注常用数据结构的外围算法(例如如何对List和Map进行查找)。
  4. 关注数据结构使用中容易出错的地方(例如是否线程是否安全等)。
  5. …

当然也完全没必要阅读大部头的著作,而只需了解关注的重点是什么,然后再到网上搜索专题文章学习即可。至于关注的重点,可以参考《xxx面试大全》中的数据结构章节。

算法

这个要具体问题具体分析了。以我接触的领域来说,大部分普通的业务系统都不会涉及到太复杂的算法,因此就没必要专门在算法上投入时间。

但在一些特殊的领域,如果算法跟不上,可能“寸步难行”,例如图形处理领域,无论是图像的变化还是增强,无一例外都要用到矩阵变换,因此就必然涉及到线性代数的内容,顺藤摸瓜,往纵深学,就必然会牵出更多的东西。

因此,对非科班生(尤其是数学不够好的),对算法学习我是持“劝退”态度的。因为,从职业发展来说,这实在是一条太“曲折”的路线。

一方面,目前的开发越来越趋专业化,算法一般由专门的算法团队负责,普通软件工程师只负责算法转换。

以我为例,虽然是科班出身,也系统的学习过算法,但也常有力有不逮的时候。复杂的算法既实现不了,甚至是理解不了。很多时候,我干脆就不做实现,直接请算法工程师告诉我思路,甚至是伪代码,而我负责转化为正式代码(例如Java)。实践证明,这种做法不仅是可行的,而且也是高效的,正所谓“术业有专攻”。

另一方面,人的精力是有限的,你完全可以把精力投入到自己更擅长的方面,例如设计、产品、架构上,从而取得“差异化”的成功。

当然,如果你“心气”很高,一定要在算法上有所作为,我也可以推荐你两本书:

  1. 《算法导论》
  2. 《数学之美》

这些都是我读过,受益良深的作品。

设计模式

设计模式,我认为是初中级程序员,向高级程序员提升的关键点。

在实践中,我见过太多程序员,前期冲劲十足,但后继乏力,最终泯然于众生。我不敢说所有的人如此,但有不少都是吃了设计模式的亏。

在工作的前几年,大部分程序员都是处于熟悉语言层面的阶段,也就是处于“技”的阶段。这个阶段,如果人还算靠谱,大概在2到3年就会过去,接下来就要进入“术”的阶段。在编程领域,“术”的最典型代表就是“设计模式”。因此,设计模式的重要性再怎么强调都不为过。

要学习设计模式,最经典的读物依然是GOF的《设计模式:可复用面向对象软件的基础》,精炼、深刻,没有一句废话。但这本书对初学者来说,读起来太艰涩,一方面是作者极度追求语言的凝练,一方面代码是用C++描述的。因此,我推荐大家阅读《Head First设计模式》,生动有趣,而且是用Java描述的。

但是,如果精力允许,我还是建议你一定要把GOF的《设计模式:可复用面向对象软件的基础》阅读一下,而且要不止一遍的读(我就是)。这本书绝对常读常新。

当然,学习设计模式,不仅要读书,更要从实践中学习。例如学习Spring框架的过程,如果你有思考,就会发现其中有太多设计模式可供借鉴。

学习设计模式,就是从实践到理论,然后再从理论到实践,反复实践,反复思索,反复总结的过程。当然,这也是从一个“码农”转变成“工程师”的过程。

软件工程

实现一个软件系统的过程,不仅只有编码。还涉及到项目安排,团队协调等一系列非技术因素。而作为一名程序员,如果想往上更进一步,独当一面,成为team leader或者开发经理等管理职务。则软件工程一定要跟上。

当然,软件工程这么多年也一直在进步,从原来的瀑布开发,到现在流行的敏捷开发,但无论怎么变,有些经典的东西还是不变的。下面我就推荐几本我认为现在依然值得深读的书:

  1. 《人月神话》
  2. 《人件》
  3. 《Scrum敏捷软件开发》

当然,关于软件工程,最好的学习方法依然是观察。观察你所在的团队、所在的公司是如何处理工程问题,然后思索,阅读,最终形成自己的方法观。

架构 & 设计

写出一个好程序,有几个维度,从下到上,也是一个程序员逐步升级的过程。

第一阶段,首先要保证基本功扎实,最简单的说,要做到语法熟练、基本框架熟练,成为一个功夫精熟的“码农”。

第二阶段,从“技”到“术”,从“码农”到“工程师”。这个阶段的关键技术是设计模式。在局部上,不仅追求实现功能,更关注实现的好,关注功能之外的维度,例如健壮性、低耦合、可扩展等指标。对主流框架(例如Spring),不仅会用,更有深刻的理解。

第三阶段,从“术”到“道”。

这个阶段,不仅在局部上追求一个模块的好坏,而且还要从整个系统层面去掌控程序,例如保证整个程序不出现系统腐败,如何安排资源的优先级等。这个时候就不是单一的维度,单一的技术能够保证了。

经常有朋友问我是如何成为一名架构师的,很难用一句话来回答。

我可以路线鲜明教你如何成为一名优秀的软件工程师,但至于如何成为一名架构师,我想除了努力,运气肯定也很重要。但无论如何,有机遇,不是还得有准备嘛?

作为一名架构师,所靠的肯定不是单一的维度,也不是但靠纯粹的读书能获得的。但就我来说,有些经典书的阅读,确实给我日常的工作带来了巨大的帮助,下面我就推荐给你:

  1. 《代码大全》、
  2. 《重构:改善既有代码的设计》
  3. 《设计原本》
  4. 《大型网站技术架构核心原理与案例分析》

作为一名程序员,从技术菜鸟到大拿的路径有很多,其中最核心的因素就是坚持和努力。学习的过程,就好像登山的过程,以我的经验,大概有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代码:

对于自学Java的人来说,如何系统的,全方面的学习Java?

直接用Maven下载源码,然后在Eclipse中Debug进去。此时,就像你平时阅读同事的源码一样。带着疑问,带着猜测。阅读的过程,边验证,边调整,总重形成体系的思路。

记着,因为Spring源码复杂,且继承体系深,所以一定要边阅读,边记笔记,边画图。例如下面就是我画过的一个图(从Eclise中截取):

对于自学Java的人来说,如何系统的,全方面的学习Java?

很重要的一点。在阅读Spring源码前,一定要先有自己的想法:如果这个东西(例如经典的getBean()方法)由你要设计,会怎么做。然后带着想法,跟(debug)进去。不断验证,不断调整。

4.不需面面俱到,只抓重点。

因为Spring源码巨大。对阅读者来说,也不是都有价值,所以一定要抓住重点。

要时刻记住阅读的初心:不是为了阅读而阅读,而是为了深刻理解Spring,从而自由运用,所谓“无真相不自由”。所以只阅读核心的,对自己有用的(这个因人而异)。下面是我当年阅读时的读书笔记提纲,贴出来供大家参考:

对于自学Java的人来说,如何系统的,全方面的学习Java?

5.Spring阅读的收益

通过阅读Spring源码,至少能有以下收获:

#.精通Java

因为 Spirng框架本身,就是对Java最“精妙”的运用。我敢保证,在阅读Spring的过程,除了发现很多Java的“新”特性外。你也能学会“大神”们,是如何正确且高效的编写Java程序。

#.学习设计

Spring框架本身就是一个“设计良好”的典型,其中大量运用到经典的设计模式,例如“观察者模式”、“单例模式”等。因此学习Spring的过程,就是学习设计的过程。

#.深刻理解Spring用法

所谓“无真相自由”。等你学习了Spring源码后。我敢保证,你回头再来看自己,或别人原来写的Spring程序,肯定会发现诸多“错误”。包括代码的冗余,冲突等。

.最后

如果你是一个初学者。刚开始阅读Spring源码,一定会感觉特别困难。因为其中涉及太多新东西。但这正说明,Spring源码是一个宝库。

咬咬牙,扛过去,你的技术层次就会跃上一个新的台阶,甚至是质的飞跃,所谓:

“会当凌绝顶,一览众山小。”

如何自学java?学习到什么程度可以找工作?找工作别人会要这种半路出家的吗??? 我个人学习Java就是自学的,所以还是有一些发言权,我是非计算机专业,上大三的时候想做程序员,因为感觉本专业不挣钱,用了一年的时间在学校自学了Java,学习的过程中无非就是两个字最重要:坚持。 因为学习Java是一个相对漫长的过程,熬夜是不可避免的,每天除了上课后,回来都在学习,晚上经常自学到1点左右,而我现在觉得,如果年轻的时候不熬夜拼一拼,那以后真的要遭罪了。和别人的差距就是在晚上,毕业之后找到一份6500的工作,不多不少还算满意,够自己生活。 然后就在工作中不断积累自己的项目经验,就这样一直做到现在, 阅读详情

相关推荐

Java能自学吗?如何自学?(附Java学习路线图)

一般来说,想要学习编程有两种渠道: 一是培训,二是自学。今天主要说说很多小伙伴关注的自学编程的问题,先说说编程是否可以自学。 答案是可以。大部分人对编程没有认知,所以会觉得它非常之难,但其实不然。编程说到底也是一门实用的技能,技能类学科只要你肯下功夫,就没有学不会的。拿画画来举例,外行人看画家作画,会觉得对方的手仿佛有自己的想法一样,可以嗖嗖嗖就画好一副,但自己拿笔画,手就不听话了,怎么都画不好,于是将画不好归结为自己没有天赋。可即使是画家,也是由最初的不会到会的,当然也可能有个别天才,但更多的是普通人的自

CZ-001的博客 1525

学习Java时,要记住的知识点太多,记不住怎么办?

“今天学习,忘记明天”,我相信这是每个学习者都会遇到的问题。 我们分析一下原因,逐一解释,然后给出解决方案,最后分享一下学习java的有效方法和途径: 记不住的可能原因 第一个:知识无用 在这个分散的时代,确实有太多的各种信息。当我们在零散的时间内获得此信息时,通常我们会做无用的工作。这样的环境,将导致知识学习的碎片化。 也就是说,尽管每个人都学到了很多知识,但他们还没有将知识内在化。尽管您已经学过,但是这种知识并不真正属于您。您只能很浅浅地了解此知识,而并不真正了解,尽管您已经学过,但并没有真正

chengxuyuan9527的博客 1802

java零基础从入门到精通(全)

目录前言1. 入门知识1.1 java体系1.2 JDK/JRE/JVM区别1.3 编译与运行理解1.4 类体函数细节2. 标识符 前言 java优势 健壮性(JVM(C++语言写的一个虚拟的计算机)、GC(垃圾回收机制)) 多线程并发 可移植性/跨平台 1. 入门知识 1.1 java体系 JavaSE:标准版 JavaEE:企业版 JavaME:微型版 1.2 JDK/JRE/JVM区别 JVM是不能独立安装的。 JRE和JDK都是可以独立安装的 层层嵌套,jvm包括jdk,jdk包括jre

码农研究僧的博客 6万+

从单体到分布式,必须解决的四个问题

一般来说,为了应对高并发和高可用,应用服务器都会由单体向分布式演变。而从单体到分布式,通常会遇到四个问题必须要去解决。 一,session共享 首先第一个要解决的就是sesison共享的问题,如下图。 通常有两种解决方案,第1种是配置nginx的负载集群策略为ip_hash,第2种是将session存储到其它地方,一般推荐放到redis中。 第1种方案适合于临时解决或者是为了兼容历史...

xingduan5153的博客 763

AMEsim柱塞泵的建模学习

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、为什么要对柱塞泵进行仿真?二、Amesim中柱塞泵的模型1.amesim中自己的定排量五柱塞的斜盘柱塞泵2.压力、流量仿真总结 前言 最近在学习Amesim进行柱塞泵的仿真学习,顺便在这里记录我的学习过程,这是我的初衷 提示:以下是本篇文章正文内容,下面案例可供参考 一、为什么要对柱塞泵进行仿真? 柱塞泵是功能和动力学比较复杂的流体机械。而在实际实验中,往往没有条件或者需要对柱塞泵做一些优化,所以需要我们利用仿真...

innocent_cft的博客 8175

第三节: 串口通信(用CubeMX学习STM32)

用CubeMX学习STM32, 串口通信学习, 通过轮询方式和中断方式两种方式进行通信演示。 STM32F407zgt6

Kevin_8_Lee的博客 8903

万字长文分享,新手小白如何自学Java(方法+步骤)

等你毕业之后,你就会发现,自己拥有夯实的计算机基础知识,强大的数据结构与算法基础,大部分的算法题你都不在话下,而且Java基础扎实,掌握主流框架,熟悉各个技术在项目中的应用,熟悉多个项目系统架构,自己开源项目获得多少多少的star,拥有丰富的项目经验……说实在的,大学四年带给我最大的收获就是思想上的改变,真正的技术学习倒也没那么重要的,反而是我对待很多事情的一些看法上,也可以说,大学四年,真的让我成长了,有了更多的想法,有了自己的目标,知道了自己该为了什么而努力,以及为什么努力了,明确了自己未来的方向…….

xhbzl的博客 6357

STM32硬件SPI调试ADS1256的3个致命坑,CubeMX配置避坑指南

本文深入解析STM32硬件SPI调试ADS1256高精度ADC芯片时常见的3大配置陷阱,包括SPI时钟频率、时钟极性与相位、数据字节序等关键问题。通过CubeMX实战配置指南和实测数据对比,提供稳定可靠的解决方案,帮助开发者避免常见错误,提升采样精度和系统稳定性。

weixin_42550597的博客 346

非科班的Java程序员该如何补充计算机基础知识,需要看哪些书?

这个问题可以升华一下:非科班程序员,入了行,该如何继续提升自己? 我是科班出身,大学也算努力,系统的掌握了计算机知识。迄今为止,也工作了将近20年。但老实说,无论是从在实际开发中,还是个人成长,回头看,大学学习的很多课程,其中有很多,要么“用处”不大,要么完全可以换个方式,更高效的学习。 其中的原因,一方面是实际开发更关注知识的“实用”,另一方面,我们的大学教学也确实与产业有点脱钩。 因此,本文,我就从实用出发,简单介绍下那些领域的知识有很大的学习必要性,以及如何有重点的学习。 数据结构 毫无疑问,数据结构

ycx2019的博客 615

MATLAB - 激光雷达 - 相机联合标定(Lidar-Camera Calibration)

激光雷达传感器和相机通常在自动驾驶应用中结合使用,因为激光雷达传感器收集三维空间信息,而相机则以二维图像捕捉空间的外观和纹理。您可以融合来自这些传感器的数据来改进物体检测和分类。激光雷达-相机标定可以估算出一个变换矩阵,给出两个传感器之间的相对旋转和平移。在进行激光雷达-相机数据融合时,您可以使用该矩阵。本图说明了激光雷达和相机标定 (LCC) 过程的工作流程,我们使用棋盘格作为标定对象。我们从激光雷达和相机数据中提取棋盘角和平面,然后在它们的坐标系之间建立几何关系,进行标定。

机器人控制与仿真应用 7370

《爬虫和逆向教程》 - 专栏介绍和目录

本专栏为爬虫初学者和进阶开发者量身定制的爬虫和逆向学习园地。为你提供全面而深入的爬虫和逆向技术指导,从入门到精通,从基础理论到高级实战,助你在数据的海洋中畅游,挖掘出有价值的信息。通过本专栏的学习,你将具备独立开发和优化爬虫程序的能力,及逆向分析能力和项目开发能力,成为爬虫领域的佼佼者。

数据知道的博客 2万+

聊聊如何系统地、全方面地自学Java?(纯文字干货)

我热爱自学,觉得自学是一条逆袭之路! 我现在主要从事java开发工作,我所掌握的java技能都是自学得来的,从大学开始到现在,我想未来,自己依然会持续自学,不单单是java,可能是方方面面的技能,只要是能提高自己的,让自己的活的更精彩的! 那么,现在那些也想要自学java的伙伴们,肯定都关心一个问题“如何系统的,全方面的自学java” 我所知道的,很多自学的小伙伴都放弃了,有的没办法后来参加培...

庆哥Java的优快云技术博客 1万+

用 SNC 和 SAP Single Sign-On Secure Login 把 SAP 登录这件小事,变成一件安全又不用输密码的事

在传统的 SAP 系统里,登录这件事看起来很朴素:用户打开 SAP GUI,输入一个 SAP 用户名,再输入一个 SAP 密码,点回车,进系统,开始干活。表面上没毛病,但从安全角度看,这种老办法问题很大。默认情况下,这些用户名和密码在网络上传输时是明文,也就是不加密传输。攻击者如果在公司网络里做监听,理论上可以直接截取到口令信息,这种风险对今天任何一家合规要求高、审计严格的企业来说,基本是不可接受的。(SAP Help Portal)SAP 给出的答案叫做 ,全称是 。SNC 做的事情可以概括成两类:一类是

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 373

【Java全栈学习路线】最全的Java学习路线及知识清单,Java自学方向指引

自学Java怎么学,找对方向最关键!在这里为大家分享最全的Java全栈学习路线及知识清单!

小新要变强的博客 6万+

Python 爬虫实战:全球咖啡期货市场数据采集与分析全攻略

通过本项目,我们实现了对全球咖啡期货市场数据的采集、处理和可视化,为市场分析和决策支持提供了数据基础。未来,可以进一步结合机器学习和深度学习技术,对咖啡期货价格进行预测和建模,提高市场分析的准确性和效率。

2201_76125261的博客 394

锂电池充放电管理-单片机通用模版

- **①两节锂电池通过电阻分压检测ADC,再根据电压划分电量等级;** - **②充电使用的是锂电池充电IC方案,可通过硬件电阻参数调节充电电流,并可以通过STAT引脚检测充电和满电状态(充电注意会抬高电压);** - **③放电根据ADC_BAT检测电池电量进行等级划分(注意大负载电压骤降瞬间);** - **④充放电过程注意在电量划分等级临界值来回抖动现象;**

a6662580的博客 1488

0基础Java自学之路

前言 最近逛知乎的时候,经常看到有人在问“0基础如何自学Java”、“干了几年**,想转行干Java靠谱吗”等问题。不禁让我回想起了自己当初自学Java的日子,因此在这个周末花了点时间,整理了这篇文章,希望对这些正打算自学Java的或者打算转行Java的人有点帮助。 我的自学之路 先告诉你们我的自学过程可能让你们有点参考。 大三的时候,班主任请了2个已经拿到offer的实验室同学来跟...

程序员囧辉 3万+

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

用我的亲身经历来告诉你如何自学Java?

在我的另一篇博文——【一年总结】记我的大一生活中,我其实已经谈过了我的大一经历,但是对于我自学Java的地方往往都是一笔带过的,因为那篇博文主要是想记录我那时所思所想,表达的主要是一种情感,而非“攻略”。 所以我觉得我有必要另起一篇来专门讲讲我是如何一步一步自学Java的。

风过孤屿,山海自成诗行。 7598

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

自学Java的人,如何系统全面的学习?

最近,收到越来越多的人请教我说想转行做程序员,自学Java,但是Java的知识太多,不知道从何学起才好,那现在,我就来分享一下经过长时间积累的经验吧。 自学Java,本身会面临来自多方的压力,所以在走每一步时都应该慎之又慎,避免付出太高的试错成本,因此在学习时要选择有重点的、高效的学习方法,否则一不小心,难以入行,白费努力。所以一定要谨记以下几点: 1.基础知识.无论学习什么都一定要抓牢,奠基石牢...

web前端技术交流群:457188470 461

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

自学java多久可以找工作(你需要个系统的java学习过程)

首先:我想要告诉你的是学习Java不难,但是也会很艰辛的敲代码。Java程序员经常需要加班,学之前要作好心理准备。其次一旦下定决心学java了,一定要坚持下去,不要半途而废。java零基础的学生自学必然会耗费大量的时间和精力,而且如果你没有定制系统的学习方案,效果将事倍功半,上java培训班也是个不俗的自由选择,再加上自己的努力,一定可以学有所成,当然一定要慎重选择靠谱的机构。 如果单纯从技能角...

1万+

为什么有些人不推荐自学Java?

综上所述,有些人不推荐自学Java的原因主要包括学习效率问题、时间与精力的投入以及就业竞争力问题。对于想要自学Java的人来说,需要充分考虑自己的学习基础、能力和目标,并制定科学合理的学习计划。如果条件允许,选择参加专业的培训或参与实际的Java项目将是一个更明智的选择,这样可以更快地掌握Java的核心知识和技能,更好地应对未来职业发展的挑战和机遇。无论选择哪种方式学习Java,持续的学习动力和热情、正确的学习方法和技巧以及积极的心态都是关键因素。二、时间与精力的投入。

xuebajiaoyu的博客 2408

自学Java难吗?别在听一些人说了

总听到一些人在说自学Java有多难多难,确实,Java不是那么容易能够掌握的语言,可自己都没有尝试学过,就只听别人的一面之词,岂不是要错过这门前途似锦的开发语言了。 自学难,其实跟你的学习能力,和学习计划有关的。关于学习能力,只能从自身上着原因了,如果你足够努力,都可以攻破重重知识点的。关于学习计划,如果你还没有,可以参考小编的这一套开始学,保你从入门到精通。 1.工具 工具部分分为不同的部分。首先,您的IDE,它是您的主要工具,几乎可以完成您要求的所有操作,例如编译、运行、调试、分析、测试、比较

m0_62916537的博客 1万+

为什么说自学Java的人就找不到工作?

自学的过程可以帮助他们掌握Java的基础知识和核心技术,并且通过自己的实践和探索,提高解决问题的能力。近年来,随着Java语言的普及和市场需求不断扩大,越来越多的人开始自学Java,希望掌握这一技能并在IT行业找到一份工作。然而,有些人却认为自学Java的人很难找到工作。那么,这种观点是否正确呢?综上所述,自学Java的人并不是找不到工作,而是需要付出更多的努力和时间来提高自己的竞争力。只要他们能够系统化地学习、积累实践经验、持续学习、注重求职技巧并且保持积极的心态,相信他们一定能够找到一份满意的工作。

xuebajiaoyu的博客 744

我的 Java 自学之路

写这篇文章的时候,我已经辞职半个月了,因为不想被JAVA潮流甩的太远,于是最近又再次开始学习了。我是2018年的本科毕业生,大学专业就是软件工程。去年8月进入了一家港资的软件外包公司。香港的公司福利好,节假日补贴也不错,可是外包公司都有一个毛病,就是累。做不完的项目和拒绝沟通的领导是我最终决定离职的原因之一。当然对于大多数人应届生来说,再学习和重培训才是我们看中的。因此,再没有找到下家的情况下,我...

夹扣的博客 1740

关于学习Java是应该是自学还是选择培训班

首先需要明白,学习Java编程无论是自学还是培训班都是各有各的缺点以及优点。 其实网上已经有很多答案了,你要根据自己的实际情况进行选择,学会了,你就是成功的。 所以无论是选择哪一种方式学习的最终目标还是为了就业和工作,想提升自己的薪资,掌握一项技能,或者说在外人看来也是一份体面的工作。包括我自己本人以上的想法全部都包含了,挣钱嘛! 不寒碜!那么接下里我就一个一个的为纠结这个问题的小伙伴进行简单的分析 一、先谈谈自学和培训班各自的优点 自学的优点: 1.锻炼自己的一个学习和坚持的能力,学Java毕竟

wanlzs521的博客 1313
上一篇: 7点建议助您写出优雅的Java代码
下一篇: Spring Boot 最核心的 3 个注解详解
Javaesandyou
博客等级 码龄5年 742粉丝 563原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值