写点什么

知乎热文 | 如何高效学习 Spring Boot?

用户头像
Jackpop
关注
发布于: 4 小时前

添加微信:code_7steps,备注“进群”,邀请你加入大牛云集的技术交流群!


关于 Spring Boot ,曾经因为项目需求,“临阵磨枪”式的学习了 一下。


但是,那时候自己使用相对简单,就做一些简单的 API 接口的开发。所以,就在网络上找了一些在线教程,结合看了一些快速入门的博客,把项目给搭建了起来。


最近由于疫情的原因,在家远程办公有了一些空闲时间,所以,就想着抽空把 Spring 更加细致的学习一遍。在这个过程中发现了一些不错的免费课程,所以来分享一下我关于 Spring Boot 的学习思路,希望能够对有需要的朋友有所帮助。

Spring Boot

当学习一门技术时,我们要提前弄明白几个问题,


  • 它是什么?

  • 为什么学?

  • 怎么样学?


下面,我就从这 3 个方面来介绍一下 Spring Boot。


Spring Boot 是什么?


介绍 Spring Boot 之前需要简短的介绍一下 Spring,因为它们是承前启后的关系,Spring Boot 是发展自 Spring 的基础上,如果不明白 Spring 就贸然介绍 Spring Boot 会觉得云里雾里。


Spring 框架是 Java 平台上的一种开源应用框架,提供具有控制反转特性的容器。举个例子,它就类似于 tensorflow 之于机器学习,如果没有 Spring,我们同样可以使用 Java EE 完成一项功能的开发,但是 Spring 的出现使 JAVA EE 开发更加容易。


Spring 的核心包括 2 个概念:控制反转(IOC)和面向切面(AOP)。


而 Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化 Spring 应用的初始搭建以及开发过程。


为什么学 Spring Boot?


前面简单的介绍了一句,Spring Boot 的设计目的是为了简化 Spring 应用


那也就是说 Spring Boot 是为了解决 Spring 的弊端而出现的,所以,这个问题又回到了 Spring 上面。


既然 Spring 不好用,那么不学不就行了?为什么还要重写设计出一个 Spring Boot?


这里就需要首先了解一下为什么学习 Spring?


下面通过一个简单的例子来说明一下。


**假设一个场景:**目前有三个角色,买水果的人(用户),卖水果的人(业务层),水果(持久化层),




先写一个接口,


publicinterface Fruit {    public void get();}
复制代码


现在实现 3 种水果的类,为了方便展示,把它们先写在一起,


// Apple.javapublicclass Apple implements Fruit{    public void get() {        System.out.println("get an apple");    }}
// Orange.javapublicclass Banana implements Fruit{ public void get() { System.out.println("get a banana"); }}
// Banana.javapublicclass Orange implements Fruit{ public void get() { System.out.println("get a organe"); }}
复制代码


现在实现一个业务层,也就是从 3 个水果类中获取水果,


// UserService.javapublicclass UserService {    private Fruit fruit = new Apple();    public void getFruit() {        fruit.get();    }}
复制代码


然后,实现一个用户类,


// User.javapublic class User {    public static void main(String[] args) {        UserService user = new UserService();        user.getFruit();    }}
复制代码


上述就是我们实现一个程序的惯用方式,这样看上去没有什么问题,目前我们调用业务层 UserService 获取到苹果,那么试想一下,**如果现在我想获取橘子怎么办?**这样就需要修改业务层代码,


// UserService.javapublicclass UserService {    private Fruit fruit = new Orange();    public void getFruit() {        fruit.get();    }}
复制代码


也许很多同学会认为这样没什么问题,那就修改一下业务层代码啊?


显然,这不是一个优秀的程序员做的事情,每当用户需求做出改变时,我们的代码都要做出相应的修改,那么有两个问题,


  • 如果工程量较大,修改的内容较多怎么办?

  • 如果我们修改代码对其他业务造成影响怎么办?


所以,一个好的设计思路就应该在不改变原代码的基础上实现我们想要的功能。


那么,接下来就应该转变思维,考虑一下,目前的控制权在业务层,所以每次用户需求改变时,业务层也要跟着改变,既然这样,我们把控制权交给用户不就行了吗?


下面来修改一下业务层的代码实现控制权的转换,


publicclass UserService {    private Fruit fruit;    public void setFruit(Fruit fruit) {        this.fruit = fruit;    }    public void getFruit() {        this.fruit.get();    }}
复制代码


细心的同学应该可以看得出改变,我在加了一个 set 方法,使得用户层可以注入不同的对象,这样我们在用户层传入哪个对象,就会获得哪个结果,


// 1. 获取橘子publicclass User {    public static void main(String[] args) {        UserImpl user = new UserImpl();        user.setFruit(new Orange());    //在这里注入对象        user.getFruit();    }}//2. 获取香蕉publicclass User {    public static void main(String[] args) {        UserImpl user = new UserImpl();        user.setFruit(new Banana());        user.getFruit();    }}
复制代码


现在来总结一下,经过改变前后到底发生了什么,




上图展示的很明确,就是控制权的反转,之前主动权在业务层,每次用户提出需求业务层就需要跟着做出改变,现在我们把主动权交给了用户,它传进什么,就得到什么样的结果,这样业务代码就不用跟着改变了。


这就是 IOC(控制反转)的核心思想。


IOC 就是 Spring 中两个主要的概念之一,另外一个就是 AOP(面向切面),它的主要思路应用动态代理,这里不详细展开。


读到这里就应该明白,我们在学习 Python、Java、C++等编程语言的过程中,都会接触到运算符、变量类型、循环、条件、面向对象这些语法,而 Spring Boot 是高于这些语法之上,更高一层的思维方式的转变。


Spring 并不像我们所学的基本语法那样的固定知识点一样,它是一种思维方式,通过这种思维方式的转变能够让项目开发更加简洁高效,这就是 Spring 的主要优点之一。


前面通过长篇大论介绍了 Spring 的核心和优点,那么现在来说一下它的缺点。


Spring 在组件注入和装配过程中需要大量的配置,那么,随着项目的增大,那么就需要很多庞大的配置项,显然,这与 Spring 的初衷是相悖的。


所以,Spring Boot 就以**“习惯优于配置”的理念在 Spring 的基础上扩展而来,它不仅继承了 Spring 的优点,还实现了自动配置 Spring**,进一步简化了开发过程,这就是 Spring Boot 的优点之一,当然,它还有诸多其他优点,例如,


  • 创建独立的 Spring 应用程序

  • 嵌入的 Tomcat,无需部署 WAR 文件

  • 简化 Maven 配置

  • 自动配置 Spring

  • 提供生产就绪型功能,如指标,健康检查和外部配置

  • 绝对没有代码生成和对 XML 没有要求配置


怎么样学?


前面只是介绍了一下 Spring 中的一个重要概念 IOC 的本质和 Spring、Spring Boot 的优点,明确了**它是什么?为什么学?**这两个问题,那么接下来就来到了最后一个问题,怎么样学?


我所介绍的只是九牛一毛,Spring Boot 包含很庞大的体系,有很多值得学习的,所以,如果真正对 Java 开发感兴趣的,我认为需要系统详细的学习一下。


但是,我需要强调一点,不要一开始就直接学习 Spring Boot,那样的话当看着各种注解、装配、组件......会觉得云里雾里,当不明白的时候又需要逐个的去网络上查找@Autowired@Component.....是什么概念?这样不仅浪费时间,而且无法深入理解它的原理和来龙去脉。


所以,在学习 Spring Boot 之前一定先学习 Spring


由于我对于 Spring 和 Spring Boot 也不是特别深入,只是之前开发前后端时用到了 Vue 和 Spring Boot,所以就不班门弄斧,这里我推荐两份不错的课程。


感兴趣的可以在哔哩哔哩搜索狂神 Java,可以看一下下面这两份免费课程,


  • 《Spring5 最新完整教程 IDEA 版》

  • 《SpringBoot 最新教程 IDEA 版》


其中《Spring5 最新完整教程 IDEA 版》共 28 讲,《SpringBoot 最新教程 IDEA 版》共 59 讲,没讲 10-20 分钟左右,当然,也有个别的在 10 分钟以内或者超过 20 分钟。


这两份课程是前段时间我空闲时间在哔哩哔哩看到的,之前本来对于看视频教程并没有太大兴趣,因为我性子比较急,所以,当学习一门知识时我更喜欢看书或者在线教程,这样的话我可以自己控制速度,但是,当抱着尝试一下的心态听了这份 Spring 教程之后我发现讲的实在太好了,从浅入深,环环相扣,每一步都会对照着官方文档结合作者自己的见解进行讲解,同时也会编码实现,理论与实践相结合。


它不像大多数教程或者博客那样,蜻蜓点水,直接告诉你这个东西怎么用,让你只知道如何使用但是却不知道为什么这样使用,而上述这两份课程则不然,例如,在讲组件的注入和装配时,它会循序渐进,


  • 完全依赖 XML 装配

  • XML 和注解结合

  • 完全依赖注解


另外,这两份课程都是 2019 年 10 至 11 月更新的,用的都是比较新的版本和特性,这样可以即学即用。



干货推荐

为了方便大家,我花费了半个月的时间把这几年来收集的各种技术干货整理到一起,其中内容包括但不限于 Python、机器学习、深度学习、计算机视觉、推荐系统、Linux、工程化、Java,内容多达 5T+,我把各个资源下载链接整理到一个文档内,目录如下:




所有干货送给大家,希望能够点赞支持一下!


https://pan.baidu.com/s/1eks7CUyjbWQ3A7O9cmYljA(提取码:0000)

发布于: 4 小时前阅读数: 3
用户头像

Jackpop

关注

还未添加个人签名 2020.09.16 加入

公众号:平凡而诗意,微信:code_7steps,全网粉丝超20万,技术进阶、优质资源、实用工具,欢迎关注!

评论

发布
暂无评论
知乎热文 | 如何高效学习Spring Boot?