记【在掘金的第一次直播】
2020年10月15日,本人有幸参与了掘金技术社区的一次直播活动,作为主讲人与小伙伴们分享了一些关于 Spring 方面的内容。这次分享的内容以概述为主,主要帮小伙伴们理清楚学习 Spring 的思路,以及学完 Spring 框架之后的进一步规划。
写这篇文章,主要是记录一下当天分享的内容,以及一些后续的复盘等等,帮助没有赶上车的小伙伴们。
【B站直播回放:https://www.bilibili.com/video/BV13i4y177ZW】
Java开发生态中,Spring究竟有多重要
既然是聊 Spring ,那咱还是要知道它的地位和分量。Spring 的地位想必都已经到 2020 年了,小伙伴们都非常的清楚。
Spring使Java变得简单
在 Spring 的官方网站 https://spring.io 中,一上来我们看到的就是 Spring 官方对 Spring 的描述:
Spring makes Java simple.modern.productive.reactive.cloud-ready.
Spring 使 Java 开发变得简单、现代化,并且可以编写生产级别的应用、响应式的应用,并且也支持云应用。
包括下面主页上也列出了 Spring 可以做的内容:
可见,Spring 代表的不仅仅是一个框架 / 一个技术,而是一整个生态。
Spring是一个生态
翻开 Spring 官网的工程概览 https://spring.io/projects ,我们会发现里面的工程实在是好多好多呀!
最顶部的两个代表之作,分别是现阶段最最流行的后端服务搭建基本框架 SpringBoot ,以及它的基底 SpringFramework :
往下看,还有关于数据访问层的 SpringData 、用于解决微服务开发的整体解决方案 SpringCloud 、用于解决权限安全方面的 SpringSecurity 、用于解决 Session 外置的 SpringSession 等等,这些都是 Spring 生态中的一个个解决方案。
Spring的使用范围极广
如果只是人家官方自己吹,那说服力很明显不是很足,咱看看主流的比较受欢迎的开源项目,它们都用了什么底层框架。
翻开码云的开源项目 https://gitee.com/explore/backend?lang=Java ,观察这些比较受欢迎的后台管理系统都是用什么搭建的:
可见这些开源项目都是基于 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 的基础知识你就都掌握了,这些知识可以应对大部分的实际编码场景
- 先学习 Spring 中 IOC 部分相关的基础内容
- 后续阶段
- 依次学习 IOC 、AOP 、事务 、Web 等模块的进阶、高级知识
- 这种层层递进的方式,可以称其为 “水平式学习”
垂直式学习
- 第一阶段
- 还是先学习 IOC 相关的基础知识
- IOC 的实现方式,依赖注入的方式
- Bean 的类型、作用域、创建方式、生命周期控制等等
- 然后,继续学习 IOC 部分的进阶知识
- 包括 IOC 容器的设计、思想
- Bean 的装配、组件扫描
- 事件驱动
- 资源管理、资源文件等等
- 接下来继续学习 IOC 部分的高级内容
- Bean 、BeanDefinition
- BeanFactory 、BeanDefinitionRegistry
- 后置处理器
- 深入底层等
- 这个阶段学习完成之后,可以说,整个 Spring 的 IOC 模块核心知识点,你基本上已经全部掌握了
- 还是先学习 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 。
https://github.com/kangjianwei/LearningJDK
学习SpringBoot和Cloud之前需要先学习Servlet吗
回答:必须的。
原因:兄dei,如果你连 HttpServletRequest 和 HttpServletResponse 都搞不明白,学 SpringBoot 开发 Web 场景的功能时,岂不就直接废了?Servlet 方面的知识是 JavaWeb 的基础,SpringWebMvc 是构建在 JavaWeb 之上的,SpringBoot 又是整合 SpringWebMvc 的,所以按照这个依赖关系,Servlet 当然是一个必学项啦,而且是基础的必学项。
框架的高级知识如何能记得更牢靠
回答:多写多用多练。
小伙伴们扪心自问一下,你一开始学习那些框架、知识等等的,发现有这样那样的高级知识,你学会了,哇塞我牛X了,我直接芜湖起飞了!可是,你真的有在实际场景下用过吗?对于咱搞开发的来讲,知识不是学了就能记住的,一定要多加练习,这个学习没有捷径,你看到的熟练都是背后有大量付出的。
写在最后
初次参与直播分享,前期准备的也比较有限,难免会出现有些地方的疏漏、或者交流不充分不到位的地方,敬请小伙伴们海涵和指正。小伙伴们可以通过加入掘金直播分享群找到我,或者通过邮箱 LinkedBear@163.com 与我联系。后续有机会的话,我也会继续参加咱掘金的直播,继续与各位小伙伴作有关 Spring 及生态相关的技术分享和交流。
最后,感谢各位小伙伴的捧场,也感谢掘金官方工作人员的辛勤付出,各位都辛苦啦!
原文作者: LinkedBear
原文链接: http://yoursite.com/2020/10/18/记【在掘金的第一次直播】/
版权声明: 转载请注明出处(必须保留作者署名及链接)