关注微信公众号【七步编程】,专注Python、AI、大数据,原创文章第一时间推送!
前言
关于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?
下面通过一个简单的例子来说明一下。
**假设一个场景:**目前有三个角色,买水果的人(用户),卖水果的人(业务层),水果(持久化层),
先写一个接口,
public interface Fruit {
public void get();
}
现在实现3种水果的类,为了方便展示,把它们先写在一起,
// Apple.java
public class Apple implements Fruit{
public void get() {
System.out.println("get an apple");
}
}
// Orange.java
public class Banana implements Fruit{
public void get() {
System.out.println("get a banana");
}
}
// Banana.java
public class Orange implements Fruit{
public void get() {
System.out.println("get a organe");
}
}
现在实现一个业务层,也就是从3个水果类中获取水果,
// UserService.java
public class UserService {
private Fruit fruit = new Apple();
public void getFruit() {
fruit.get();
}
}
然后,实现一个用户类,
// User.java
public class User {
public static void main(String[] args) {
UserService user = new UserService();
user.getFruit();
}
}
上述就是我们实现一个程序的惯用方式,这样看上去没有什么问题,目前我们调用业务层UserService获取到苹果,那么试想一下,**如果现在我想获取橘子怎么办?**这样就需要修改业务层代码,
// UserService.java
public class UserService {
private Fruit fruit = new Orange();
public void getFruit() {
fruit.get();
}
}
也许很多同学会认为这样没什么问题,那就修改一下业务层代码啊?
显然,这不是一个优秀的程序员做的事情,每当用户需求做出改变时,我们的代码都要做出相应的修改,那么有两个问题,
- 如果工程量较大,修改的内容较多怎么办?
- 如果我们修改代码对其他业务造成影响怎么办?
所以,一个好的设计思路就应该在不改变原代码的基础上实现我们想要的功能。
那么,接下来就应该转变思维,考虑一下,目前的控制权在业务层,所以每次用户需求改变时,业务层也要跟着改变,既然这样,我们把控制权交给用户不就行了吗?
下面来修改一下业务层的代码实现控制权的转换,
public class UserService {
private Fruit fruit;
public void setFruit(Fruit fruit) {
this.fruit = fruit;
}
public void getFruit() {
this.fruit.get();
}
}
细心的同学应该可以看得出改变,我在加了一个set方法,使得用户层可以注入不同的对象,这样我们在用户层传入哪个对象,就会获得哪个结果,
// 1. 获取橘子
public class User {
public static void main(String[] args) {
UserImpl user = new UserImpl();
user.setFruit(new Orange()); //在这里注入对象
user.getFruit();
}
}
//2. 获取香蕉
public class 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月更新的,用的都是比较新的版本和特性,这样可以即学即用。
资源
我在百度网盘也分享了一些Spring方面的视频教程、源代码、笔记,其中包括,SSM、Spring Boot、Spring Cloud,感兴趣的可以阅读我的另一篇文章【 干货 | 2019年共享免费资源整理(上):学习资源篇】查看资源获取方式。