作为一个自学过来的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<Long,String> idNameMap = list.stream() .collect(Collectors.toMap(Classify::getId, Classify::getName));

后来觉得这样需要两行且需要转Stream(每调用stream方法后进行换行可以提高流程转换的可读性),可不可以通过函数式编程简化为一行并保证可读性,于是我写了一个工具类去完成这件事:

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

当时在这过程中用到的Function函数式接口也提高了我对函数式编程的理解,转换的代码也成了以下这个样子:

Map<Long, String> 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)上或者博客上,既能方便日后回顾,又可添加自己的潜在价值(大公司是有一套根据博客点赞与浏览量筛选候选人的方式的,即使学历不足,但只要你的博客展示出你强硬的技术水平,不用担心找不到想要的面试机会)。