阅读 882

Spring漫漫深耕路 - 记在掘金的第一次直播

2020年10月15日,本人有幸参与了掘金技术社区的一次直播活动,作为主讲人与小伙伴们分享了一些关于 Spring 方面的内容。这次分享的内容以概述为主,主要帮小伙伴们理清楚学习 Spring 的思路,以及学完 Spring 框架之后的进一步规划。

写这篇文章,主要是记录一下当天分享的内容,以及一些后续的复盘等等,帮助没有赶上车的小伙伴们。

【B站直播回放:www.bilibili.com/video/BV13i…

Java开发生态中,Spring究竟有多重要

既然是聊 Spring ,那咱还是要知道它的地位和分量。Spring 的地位想必都已经到 2020 年了,小伙伴们都非常的清楚。

Spring使Java变得简单

在 Spring 的官方网站 spring.io 中,一上来我们看到的就是 Spring 官方对 Spring 的描述:

Spring makes Java simple.modern.productive.reactive.cloud-ready.

Spring 使 Java 开发变得简单、现代化,并且可以编写生产级别的应用、响应式的应用,并且也支持云应用。

包括下面主页上也列出了 Spring 可以做的内容:

可见,Spring 代表的不仅仅是一个框架 / 一个技术,而是一整个生态。

Spring是一个生态

翻开 Spring 官网的工程概览 spring.io/projects ,我们会发现里面的工程实在是好多好多呀!

最顶部的两个代表之作,分别是现阶段最最流行的后端服务搭建基本框架 SpringBoot ,以及它的基底 SpringFramework :

往下看,还有关于数据访问层的 SpringData 、用于解决微服务开发的整体解决方案 SpringCloud 、用于解决权限安全方面的 SpringSecurity 、用于解决 Session 外置的 SpringSession 等等,这些都是 Spring 生态中的一个个解决方案。

Spring的使用范围极广

如果只是人家官方自己吹,那说服力很明显不是很足,咱看看主流的比较受欢迎的开源项目,它们都用了什么底层框架。

翻开码云的开源项目 gitee.com/explore/bac… ,观察这些比较受欢迎的后台管理系统都是用什么搭建的:

可见这些开源项目都是基于 Spring / SpringBoot 搭建的!这足够有说服力了吧,连这些主流的、受欢迎的项目都是用 Spring 搭建的,那就足以说明 Spring 真的足够的强大了。

Spring是面试常客

最后一个点是关于面试,一直以来面试中就容易问到 Spring 这个框架,而且近年来难度有上升趋势,小伙伴们看以下几个问题都能回答多少呢:

  • 如何理解 Spring 中的 IOC ?
  • Bean 的生命周期包括哪些阶段?
  • Spring 如何处理循环依赖?
  • Spring 的事务在什么情况下会失效?
  • DispatcherServlet 的工作流程?

这些问题,在 Spring 的小册,以及 SpringBoot 的小册中,都有相应的解答,小册总结的面试题很多,如果小伙伴们有在准备面试的话,小册会是你备战的一个坚实的依靠。

如何才能全方面的掌握Spring

那既然 Spring 如此的重要,我们应该如何全方面的去学习、掌握 Spring 这个框架呢?

简单的来讲,我们可以分为 4 个部分来学习:

IOC

IOC 的部分是整个 Spring 框架最强大,同时也是最复杂的部分,这里面包含的知识点实在是太多了,咱可以简单地罗列一下:

  • IOC 的思想及实现方式
    • IOC 的两种实现方式分别是依赖查找、依赖注入
    • 如何实现依赖查找、依赖注入,都有哪些编码实现的方式
  • Bean 的注册、创建、装配等
    • Bean 的类型、作用域
    • Bean 的创建方式、装配方式
    • 组件扫描
  • Bean 与 BeanDefinition
    • Bean 的定义是如何设计的
    • BeanDefinition 如何与 IOC 容器配合创建 bean 实例
  • 事件驱动、资源管理、后置处理器
  • Bean 、IOC 容器的生命周期
  • ......

这些知识点,在 《从 0 开始深入学习 Spring》的小册中,全部都会讲到,而且难度都是逐层递进的,包括其中涉及到的面试题总结等等。

AOP&事务

Spring 的两大核心,除了 IOC 之外,另外一个就是 AOP 了。咱都知道 AOP 的核心底层实现是动态代理,那它是怎么实现的,如何编写 AOP 的切面;以及 Spring 中对于 AOP 的一个实现:事务管理,它又是怎么使用的,如何编程式 / 声明式 / 配置式的添加事务,以及它的底层如何实现事务控制,这都是在 AOP 和事务部分要学习的。

这个部分的内容大概可以划分为如下内容:

  • AOP 与动态代理
    • jdk / Cglib
  • AOP 的实现、应用
    • 日志打印
    • 权限拦截
  • 事务管理
    • 编程式 / 声明式 / 配置式添加事务
    • 事务传播行为
  • AOP & 事务控制底层核心
    • AOP 如何创建代理对象
    • 事务管理器如何控制开启 / 提交 / 回滚事务

Web

大多数人都喜欢把 Spring 跟 SpringMVC 分开来说,但确切的说,SpringMVC 是 Spring 框架的一部分,并且自打 Spring 5 出现之后,SpringMVC 多了一个孪生兄弟 SpringWebFlux ,所以 SpringMVC 也被称为 SpringWebMvc 了。

同样的,Web 模块中 Spring 也是重拳出击,这部分内容主要围绕以下的一些关键知识点来学习:

  • Spring 整合 Web 工程
  • SpringWebMvc
    • 控制器的编写与使用
    • 参数绑定
    • 数据校验
    • 国际化
    • 拦截器
  • WebMvc 中的核心组件工作机制、流程、原理
    • DispatcherServlet
    • HandlerMapping
    • HandlerAdapter
    • ViewResolver
    • ......

SpringWebFlux 因为用的人还很少,而且理解的难度相对很大,所以这里我们只是提一下,如果小伙伴已经熟练掌握了 SpringWebMvc ,那可以试着学习一下 WebFlux 的东西。

整合

如果只是因为 Spring 这个框架本身强大的话,还不足以在整个 JavaWeb 的开发界独占鳌头,它优秀且强大的整合第三方技术的能力绝对是不可或缺的一部分。通常来讲我们接触的比较多的、比较知名的技术,几乎都与 Spring 框架进行了整合。

这里面不乏包含咱熟悉的技术:

  • 数据持久层框架:MyBatis 、Hibernate
  • 缓存中间件:Redis 、MongoDB
  • 消息中间件:RabbitMQ 、Kafka
  • 搜索引擎:ElasticSearch 、Solr
  • ......

学习这些技术的时候,一定要记得顺便学习它与 Spring 的整合。

学习的思路

对于 Spring 框架的学习,作者可以提供两种思路:

水平式学习
  • 第一阶段
    • 先学习 Spring 中 IOC 部分相关的基础内容
      • 包括 IOC 的实现方式,依赖注入的方式
      • Bean 的类型、作用域、创建方式、生命周期控制等等
    • 然后学习 AOP 部分的基础内容
      • 复习一下动态代理
      • 学习 xml / 注解的方式编写 AOP 的切面等等
    • 接下来是事务部分的基础
      • Spring 如何整合 jdbc
      • JdbcTemplate 的使用
      • 如何使用编程式事务、声明式事务
    • 最后学习 SpringWebMvc 的一些基础
      • 包括控制器的编写、参数绑定、响应 json 、拦截器等等
    • 等这些基础部分学习完毕后,基本上 Spring 的基础知识你就都掌握了,这些知识可以应对大部分的实际编码场景
  • 后续阶段
    • 依次学习 IOC 、AOP 、事务 、Web 等模块的进阶、高级知识
    • 这种层层递进的方式,可以称其为 “水平式学习”

垂直式学习
  • 第一阶段
    • 还是先学习 IOC 相关的基础知识
      • IOC 的实现方式,依赖注入的方式
      • Bean 的类型、作用域、创建方式、生命周期控制等等
    • 然后,继续学习 IOC 部分的进阶知识
      • 包括 IOC 容器的设计、思想
      • Bean 的装配、组件扫描
      • 事件驱动
      • 资源管理、资源文件等等
    • 接下来继续学习 IOC 部分的高级内容
      • Bean 、BeanDefinition
      • BeanFactory 、BeanDefinitionRegistry
      • 后置处理器
      • 深入底层等
    • 这个阶段学习完成之后,可以说,整个 Spring 的 IOC 模块核心知识点,你基本上已经全部掌握了
  • 后续阶段
    • 按照这个顺序继续学习 AOP 、事务 、Web 模块的各个层级的知识
    • 这种分模块学习,每个模块都是由浅入深的学习思路,可以称其为 “垂直式学习”

两种方法思路任选其一,根据自己的学习风格、思维和习惯来就好。

不止是学习 Spring ,学习其它框架 / 技术时,这两种思路同样适用。

掌握Spring之后如何作中长期规划

Spring 框架学习完毕之后,接下来的规划也是至关重要的。明确自己目前所处的位置,并针对自己的情况制定中长期的规划,对自己的整个职业生涯的重要性不言而喻。作者在此也只是提一些导向性的建议,帮助小伙伴们理清自己。

  • 如果 Spring 是你的第一个学习的框架 / 刚学完 SSM
    • 那么接下来你最好先停下来,把这部分的知识巩固住,并且找一个实际的项目 / 需求做一下,体会一下项目开发的感觉,顺便这个期间你的基础知识也就能得到巩固了
  • 如果 Spring 框架本身已经掌握的不错了
    • 后续的计划可以围绕着 Spring 的生态展开,SpringBoot 是一个非常好的选择,因为 SpringBoot 是完全构建于 Spring 框架之上,它充分利用了 Spring 底层设计的机制,也扩展了一些新的机制(如自动装配、新的后置处理器等)
  • 如果 Spring 和 SpringBoot 都基本掌握了
    • 那么中长期的规划可以从两种路线出发
    • 要么,继续进攻 SpringCloud 微服务解决方案,了解和实践微服务开发
    • 要么,研究学习主流的开源中间件(Redis 、RabbitMQ 、ElasticSearch 等),扩充技术栈的广度

Q&A

还没毕业的同学,实习之前需要掌握SpringCloud吗

回答:不需要。

原因:对于初入职场的小伙伴,公司更看重的是你的基本功,基本功扎实,想必可塑性都不会差。所以,尽可能的让你的基础知识掌握得更牢靠吧(JavaSE 、JavaWeb 、基本的框架等)。

AOP在哪些场景下会失效

回答:一般发生在后置处理器的初始化阶段。

原理:可参照小册第 34 章和第 48 章(后续更新)。

JavaSE的源码阅读起来有些吃力,有什么好办法吗

回答:可参考开源项目 learningjdk 。

github.com/kangjianwei…

学习SpringBoot和Cloud之前需要先学习Servlet吗

回答:必须的。

原因:兄dei,如果你连 HttpServletRequest 和 HttpServletResponse 都搞不明白,学 SpringBoot 开发 Web 场景的功能时,岂不就直接废了?Servlet 方面的知识是 JavaWeb 的基础,SpringWebMvc 是构建在 JavaWeb 之上的,SpringBoot 又是整合 SpringWebMvc 的,所以按照这个依赖关系,Servlet 当然是一个必学项啦,而且是基础的必学项。

框架的高级知识如何能记得更牢靠

回答:多写多用多练。

小伙伴们扪心自问一下,你一开始学习那些框架、知识等等的,发现有这样那样的高级知识,你学会了,哇塞我牛X了,我直接芜湖起飞了!可是,你真的有在实际场景下用过吗?对于咱搞开发的来讲,知识不是学了就能记住的,一定要多加练习,这个学习没有捷径,你看到的熟练都是背后有大量付出的。


写在最后

初次参与直播分享,前期准备的也比较有限,难免会出现有些地方的疏漏、或者交流不充分不到位的地方,敬请小伙伴们海涵和指正。小伙伴们可以通过加入掘金直播分享群找到我,或者通过邮箱 LinkedBear@163.com 与我联系。后续有机会的话,我也会继续参加咱掘金的直播,继续与各位小伙伴作有关 Spring 及生态相关的技术分享和交流。

最后,感谢各位小伙伴的捧场,也感谢掘金官方工作人员的辛勤付出,各位都辛苦啦!