一、SpringBoot簡介
SpringBoot
是由 Pivotal
團隊提供的全新框架,其設計目的是用來簡化 Spring
應用的初始搭建以及開發過程。
使用了 Spring
框架後已經簡化了我們的開發。而 SpringBoot
又是對 Spring
開發進行簡化的,可想而知 SpringBoot
使用的簡單及廣泛性。既然 SpringBoot
是用來簡化 Spring
開發的,那我們就先回顧一下,以 SpringMVC
開發爲例:
-
創建工程,並在
pom.xml
配置文件中配置所依賴的座標
-
編寫
web3.0
的配置類作爲
web
程序,web3.0
的配置類不能缺少,而這個配置類還是比較麻煩的,代碼如下
-
編寫
SpringMVC
的配置類
做到這只是將工程的架子搭起來。要想被外界訪問,最起碼還需要提供一個 Controller
類,在該類中提供一個方法。
-
編寫
Controller
類
從上面的 SpringMVC
程序開發可以看到,前三步都是在搭建環境,而且這三步基本都是固定的。SpringBoot
就是對這三步進行簡化了。接下來我們通過一個入門案例來體現 SpingBoot
簡化 Spring
開發。
1.1 SpringBoot快速入門
1.1.1 開發步驟
SpringBoot
開發起來特別簡單,分爲如下幾步:
-
創建新模塊,選擇Spring初始化,並配置模塊相關基礎信息
-
選擇當前模塊需要使用的技術集
-
開發控制器類
-
運行自動生成的Application類
知道了 SpringBoot
的開發步驟後,接下來我們進行具體的操作,
1.1.1.1 創建新模塊
使用的是商用版的idea,所以沒有商業版idea的讀者瞭解一下即可,創建方式不止這一種
-
點擊
+
選擇New Module
創建新模塊
-
選擇
Spring Initializr
,用來創建SpringBoot
工程以前我們選擇的是
Maven
,今天選擇Spring Initializr
來快速構建SpringBoot
工程。而在Module SDK
這一項選擇我們安裝的JDK
版本。
-
對
SpringBoot
工程進行相關的設置我們使用這種方式構建的
SpringBoot
工程其實也是Maven
工程,而該方式只是一種快速構建的方式而已。注意:打包方式這裏需要設置爲
Jar
-
選中
Web
,然後勾選Spring Web
由於我們需要開發一個
web
程序,使用到了SpringMVC
技術,所以按照下圖紅框進行勾選
-
下圖界面不需要任何修改,直接點擊
Finish
完成SpringBoot
工程的構建
經過以上步驟後就創建瞭如下結構的模塊,它會幫我們自動生成一個 Application
類,而該類一會再啓動服務器時會用到
注意:
在創建好的工程中不需要創建配置類
創建好的項目會自動生成其他的一些文件,而這些文件目前對我們來說沒有任何作用,所以可以將這些文件刪除。
可以刪除的目錄和文件如下:
.mvn
.gitignore
HELP.md
mvnw
mvnw.cmd
1.1.1.2 創建 Controller
在 com.itheima.controller
包下創建 BookController
,代碼如下:
@RestController
@RequestMapping("/books")
public class BookController {
@GetMapping("/{id}")
public String getById(@PathVariable Integer id){
System.out.println("id ==> "+id);
return "hello , spring boot!";
}
}
1.1.1.3 啓動服務器
運行 SpringBoot
工程不需要使用本地的 Tomcat
和 插件,只運行項目 com.itheima
包下的 Application
類,我們就可以在控制檯看出如下信息
1.1.1.4 進行測試
使用 Postman
工具來測試我們的程序
通過上面的入門案例我們可以看到使用 SpringBoot
進行開發,使整個開發變得很簡單,那它是如何做到的呢?
要研究這個問題,我們需要看看 Application
類和 pom.xml
都書寫了什麼。先看看 Applicaion
類,該類內容如下:
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
這個類中的東西很簡單,就在類上添加了一個 @SpringBootApplication
註解,而在主方法中就一行代碼。我們在啓動服務器時就是執行的該類中的主方法。
再看看 pom.xml
配置文件中的內容
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!--指定了一個父工程,父工程中的東西在該工程中可以繼承過來使用-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.0</version>
</parent>
<groupId>com.itheima</groupId>
<artifactId>springboot_01_quickstart</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!--JDK 的版本-->
<properties>
<java.version>8</java.version>
</properties>
<dependencies>
<!--該依賴就是我們在創建 SpringBoot 工程勾選的那個 Spring Web 產生的-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--這個是單元測試的依賴,我們現在沒有進行單元測試,所以這個依賴現在可以沒有-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<!--這個插件是在打包時需要的,而這裏暫時還沒有用到-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
我們代碼之所以能簡化,就是因爲指定的父工程和 Spring Web
依賴實現的。具體的我們後面在介紹。
1.1.2 對比
做完 SpringBoot
的入門案例後,接下來對比一下 Spring
程序和 SpringBoot
程序。如下圖
-
座標
Spring
程序中的座標需要自己編寫,而且座標非常多SpringBoot
程序中的座標是我們在創建工程時進行勾選自動生成的 -
web3.0配置類
Spring
程序需要自己編寫這個配置類。這個配置類大家之前編寫過,肯定感覺很複雜SpringBoot
程序不需要我們自己書寫 -
配置類
Spring/SpringMVC
程序的配置類需要自己書寫。而SpringBoot
程序則不需要書寫。
注意:基於Idea的
Spring Initializr
快速構建SpringBoot
工程時需要聯網。
1.1.3 官網構建工程
在入門案例中之所以能快速構建 SpringBoot
工程,是因爲 Idea
使用了官網提供了快速構建 SpringBoot
工程的組件實現的。那如何在官網進行工程構建呢?通過如下步驟構建
1.1.3.1 進入SpringBoot官網
官網地址如下:
https://spring.io/projects/spring-boot
進入到 SpringBoot
官網後拖到最下方就可以看到如下內容
然後點擊 Spring Initializr
超鏈接就會跳轉到如下頁面
這個頁面內容是不是感覺很眼熟的,這和我們使用 Idea
快速構建 SpringBoot
工程的界面基本相同。在上面頁面輸入對應的信息
1.1.3.2 選擇依賴
選擇 Spring Web
可以點擊上圖右上角的 ADD DEPENDENCIES... CTRL + B
按鈕,就會出現如下界面
1.1.3.3 生成工程
以上步驟完成後就可以生成 SpringBoot
工程了。在頁面的最下方點擊 GENERATE CTRL + 回車
按鈕生成工程並下載到本地,如下圖所示
打開下載好的壓縮包可以看到工程結構和使用 Idea
生成的一模一樣,如下圖
而打開 pom.xml
文件,裏面也包含了父工程和 Spring Web
的依賴。
通過上面官網的操作,我們知道 Idea
中快速構建 SpringBoot
工程其實就是使用的官網的快速構建組件,那以後即使沒有 Idea
也可以使用官網的方式構建 SpringBoot
工程。
1.1.4 SpringBoot工程快速啓動
1.1.4.1 問題導入
以後我們和前端開發人員協同開發,而前端開發人員需要測試前端程序就需要後端開啓服務器,這就受制於後端開發人員。爲了擺脫這個受制,前端開發人員嘗試着在自己電腦上安裝 Tomcat
和 Idea
,在自己電腦上啓動後端程序,這顯然不現實。
我們後端可以將 SpringBoot
工程打成 jar
包,該 jar
包運行不依賴於 Tomcat
和 Idea
這些工具也可以正常運行,只是這個 jar
包在運行過程中連接和我們自己程序相同的 Mysql
數據庫即可。這樣就可以解決這個問題,如下圖
那現在問題是如何打包呢?
1.1.4.2 打包
由於我們在構建 SpringBoot
工程時已經在 pom.xml
中配置瞭如下插件
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
所以我們只需要使用 Maven
的 package
指令打包就會在 target
目錄下生成對應的 Jar
包。
注意:該插件必須配置,不然打好的
jar
包也是有問題的。
1.1.4.3 啓動
進入 jar
包所在位置,在 命令提示符
中輸入如下命令
jar -jar springboot_01_quickstart-0.0.1-SNAPSHOT.jar
執行上述命令就可以看到 SpringBoot
運行的日誌信息
1.2 SpringBoot概述
SpringBoot
是由Pivotal團隊提供的全新框架,其設計目的是用來簡化Spring應用的初始搭建以及開發過程。
大家已經感受了 SpringBoot
程序,回過頭看看 SpringBoot
主要作用是什麼,就是簡化 Spring
的搭建過程和開發過程。
原始 Spring
環境搭建和開發存在以下問題:
-
配置繁瑣
-
依賴設置繁瑣
SpringBoot
程序優點恰巧就是針對 Spring
的缺點
-
自動配置。這個是用來解決
Spring
程序配置繁瑣的問題 -
起步依賴。這個是用來解決
Spring
程序依賴設置繁瑣的問題 -
輔助功能(內置服務器,...)。我們在啓動
SpringBoot
程序時既沒有使用本地的tomcat
也沒有使用tomcat
插件,而是使用SpringBoot
內置的服務器。
接下來我們來說一下 SpringBoot
的起步依賴
1.2.1 起步依賴
我們使用 Spring Initializr
方式創建的 Maven
pom.xml
配置文件中自動生成了很多包含 starter
的依賴,如下圖
這些依賴就是啓動依賴,接下來我們探究一下他是如何實現的。
1.2.1.1 探索父工程
從上面的文件中可以看到指定了一個父工程,按住ctrl鍵,點擊spring-boot-starter-parent我們進入到父工程,發現父工程中又指定了一個父工程,如下圖所示
按住ctrl鍵,點擊spring-boot-dependencies再進入到該父工程中,在該工程中我們可以看到配置內容結構如下圖所示
上圖中的 properties
標籤中定義了各個技術軟件依賴的版本,避免了我們在使用不同軟件技術時考慮版本的兼容問題。在 properties
中我們找 servlet
和 mysql
的版本如下圖
dependencyManagement
標籤是進行依賴版本鎖定,但是並沒有導入對應的依賴;如果我們工程需要那個依賴只需要引入依賴的 groupid
和 artifactId
不需要定義 version
。
而 build
標籤中也對插件的版本進行了鎖定,如下圖
看完了父工程中 pom.xml
的配置後不難理解我們工程的的依賴爲什麼都沒有配置 version
。
1.2.1.2 探索依賴
在我們創建的工程中的 pom.xml
中配置瞭如下依賴
進入到該依賴,查看 pom.xml
的依賴會發現它引入瞭如下的依賴
裏面的引入了 spring-web
和 spring-webmvc
的依賴,這就是爲什麼我們的工程中沒有依賴這兩個包還能正常使用 springMVC
中的註解的原因。
而依賴 spring-boot-starter-tomcat
,從名字基本能確認內部依賴了 tomcat
,所以我們的工程才能正常啓動。
結論:以後需要使用技術,只需要引入該技術對應的起步依賴即可,不需要定義 version
1.2.1.3 小結
starter
-
SpringBoot
中常見項目名稱,定義了當前項目使用的所有項目座標,以達到減少依賴配置的目的
parent
-
所有
SpringBoot
項目要繼承的項目,定義了若干個座標版本號(依賴管理,而非依賴),以達到減少依賴衝突的目的 -
spring-boot-starter-parent
(2.5.0)與spring-boot-starter-parent
(2.4.6)共計57處座標版本不同,所以在實際的項目開發中,一般不會使用最新的版本,而是使用最合理的版本
實際開發
-
使用任意座標時,僅書寫GAV中的G和A,V由SpringBoot提供
G:groupid
A:artifactId
V:version
-
如發生座標錯誤,再指定version(要小心版本衝突)
1.2.2 程序啓動
創建的每一個 SpringBoot
程序時都包含一個類似於下面的類,我們將這個類稱作引導類
@SpringBootApplication
public class Springboot01QuickstartApplication {
public static void main(String[] args) {
SpringApplication.run(Springboot01QuickstartApplication.class, args);
}
}
注意:
-
SpringBoot
在創建項目時,採用jar的打包方式 -
SpringBoot
的引導類是項目的入口,運行main
方法就可以啓動項目因爲我們在
pom.xml
中配置了spring-boot-starter-web
依賴,而該依賴通過前面的學習知道它依賴tomcat
,所以運行main
方法就可以使用tomcat
啓動咱們的工程。
1.2.3 切換web服務器
現在我們啓動工程使用的是 tomcat
服務器,那能不能不使用 tomcat
而使用 jetty
服務器,而要切換 web
服務器就需要將默認的 tomcat
服務器給排除掉,怎麼排除呢?使用 exclusion
標籤
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<artifactId>spring-boot-starter-tomcat</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
</exclusions>
</dependency>
現在我們運行引導類可以嗎?運行一下試試,打印的日誌信息如下
程序直接停止了,爲什麼呢?那是因爲排除了 tomcat
服務器,程序中就沒有服務器了。所以此時不光要排除 tomcat
服務器,還要引入 jetty
服務器。在 pom.xml
中因爲 jetty
的起步依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
接下來再次運行引導類,在日誌信息中就可以看到使用的是 jetty
服務器