作為一個自學過來的Java開發希望以下一些個人的學習經驗可以幫到你。

學習路徑

在學習Java的相關知識時,必須先確立一條學習路徑,這方面可以參考國內互聯網公司的Java相關職位的技術要求。個人是一名純Java后端,我建議的學習路徑是Java基礎->Mysql->mybatis->Spring Boot->SpringCloud->Redis,這些都是目前國內大部分互聯網公司都會使用的技術棧。當對這些都有一定了解后個人建議可以去了解一些中間件或擴展知識,如消息中心(RocketMQ、Kafka)、Nginx、ELK(ElasticSearch+Logtash+Kibana)、Docker+Kubernetes+Rancher等。

學習方法

在學習期間一定要多敲代碼操作,個人建議再簡單的知識點最好到敲碼驗證一下,并在敲的過程中要思考清楚這個類/方法的主要作用是什么,并在此之上思考在實際開發中可以用到什么地方。

自學java

Java基礎

Java基礎類中常見的函數式接口Function、Predicate、Consumer、BiConsumer等,對這些接口有所了解的都知道Java的Stream、Map、Optional等類中有不少方法的參數都是這些函數式接口的,最常見的用法就是Map的foreach(BiConsumer)、List的foreach(Consumer)、List.stream()轉Stream后的一系列函數式操作,但從書籍/網站上了解到這些知識以一回事,有沒有實際測試過放到項目中又是另一回事。每次我自己去編碼驗證知識點成功后都會感到成就感,然后會思索能不能再擴展到其它地方使用。

以從List中提取屬性轉Map為例,最原生的做法就是將List轉Stream再函數式提取,如下:

Map idNameMap = list.stream() .collect(Collectors.toMap(Classify::getId, Classify::getName));

后來覺得這樣需要兩行且需要轉Stream(每調用stream方法后進行換行可以提高流程轉換的可讀性),可不可以通過函數式編程簡化為一行并保證可讀性,于是我寫了一個工具類去完成這件事:

public static Map collectToMap(Collection list, Function keyGetter) {
Map propertiesMap = new HashMap<>(list.size());
list.forEach(e -> propertiesMap.put(keyGetter.apply(e), e));
return propertiesMap;
}

當時在這過程中用到的Function函數式接口也提高了我對函數式編程的理解,轉換的代碼也成了以下這個樣子:

Map idMap = ListUtils.collectToMap(list,Classify::getId,Classify::getName);

雖然這不是什么了不起的知識點與編碼,但實踐過程中帶來的提升遠非僅僅觀看帶來的提升高的。

框架/工具學習

所謂的框架只是基于基礎搭建達到某些功能的工具集合,使用合適的框架可以很好的避免重復造輪子耗費的成本,但對于框架的核心流程還是需要理解的,這樣才可以再實際開發中靈活去使用與擴展,所以個人推薦框架學習的方式是:了解其功能->功能的核心加載流程->嘗試根據自己的想法進行擴展。

自學java

以SpringBoot為例,SpringBoot為我們大大的縮減了項目搭建所需要的實際,其為大部分開發者都默認設置好了常用的配置值,當默認配置不是我們想要的時候我們只需在配置文件中更改即可。SpringBoot的自動化配置雖然可以省去不少麻煩,但如果我們有些想要的自動化配置SpringBoot沒有提供怎么辦?那這時我們就需要了解SpringBoot自動化配置的加載流程,并據此方式自定義一套我們自己的自動化配置,所以在學習每個框架前我都會先了解該框架的核心是哪。個人當初在了解了SpringBoot的加載流程后也寫了全局參數校驗、Swagger自動化配置、自己使用的SpringBoot common框架,當自己想搭點功能測試時也可以快速的添加自己所需要的腳架依賴。

tips:SpringBoot的自動化配置流程是讀取classpath:META-INF/

spring.factories

(即resources/

spring.factories)文件中的配置類,然后再生成該配置類容器bean,并根據該類的掃描配置生成所需bean,配置文件的提示是根據META-INF/

spring-configuration-

metadata.json

中的內容進行提示的,可以在spring boot的各種集成框架下找到這些文件,spring-boot-autoconfigure依賴包中存放了自動化配置加載流程的功能類。

知識總結

當學習完一套技術知識點后,個人建議可以做一下總結,因為總結的過程是一個知識梳理的過程,可以加深對知識的理解,如我之前在使用RocketMQ作為消息中心編碼測試并項目發布后也寫了一篇Spring Boot RocketMQ的使用方式與消息中心的架構設計及作用,在總結完后我是可以感到自己在這方面知識理解的提升的。

知識總結個人建議可以總結到筆記軟件(如目前個人的筆記用的是Boostnote)上或者博客上,既能方便日后回顧,又可添加自己的潛在價值(大公司是有一套根據博客點贊與瀏覽量篩選候選人的方式的,即使學歷不足,但只要你的博客展示出你強硬的技術水平,不用擔心找不到想要的面試機會)。