Java開發學習(三十五)----SpringBoot快速入門及起步依賴解析

一、SpringBoot簡介

SpringBoot 是由 Pivotal 團隊提供的全新框架,其設計目的是用來簡化 Spring 應用的初始搭建以及開發過程。

使用了 Spring 框架後已經簡化了我們的開發。而 SpringBoot 又是對 Spring 開發進行簡化的,可想而知 SpringBoot 使用的簡單及廣泛性。既然 SpringBoot 是用來簡化 Spring 開發的,那我們就先回顧一下,以 SpringMVC 開發爲例:

  1. 創建工程,並在 pom.xml 配置文件中配置所依賴的座標

  1. 編寫 web3.0 的配置類

    作爲 web 程序,web3.0 的配置類不能缺少,而這個配置類還是比較麻煩的,代碼如下

  1. 編寫 SpringMVC 的配置類

做到這只是將工程的架子搭起來。要想被外界訪問,最起碼還需要提供一個 Controller 類,在該類中提供一個方法。

  1. 編寫 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 類,而該類一會再啓動服務器時會用到

注意:

  1. 在創建好的工程中不需要創建配置類

  2. 創建好的項目會自動生成其他的一些文件,而這些文件目前對我們來說沒有任何作用,所以可以將這些文件刪除。

    可以刪除的目錄和文件如下:

    • .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 問題導入

以後我們和前端開發人員協同開發,而前端開發人員需要測試前端程序就需要後端開啓服務器,這就受制於後端開發人員。爲了擺脫這個受制,前端開發人員嘗試着在自己電腦上安裝 TomcatIdea ,在自己電腦上啓動後端程序,這顯然不現實。

我們後端可以將 SpringBoot 工程打成 jar 包,該 jar 包運行不依賴於 TomcatIdea 這些工具也可以正常運行,只是這個 jar 包在運行過程中連接和我們自己程序相同的 Mysql 數據庫即可。這樣就可以解決這個問題,如下圖

那現在問題是如何打包呢?

1.1.4.2 打包

由於我們在構建 SpringBoot 工程時已經在 pom.xml 中配置瞭如下插件

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
</plugin>

所以我們只需要使用 Mavenpackage 指令打包就會在 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 中我們找 servletmysql 的版本如下圖

dependencyManagement 標籤是進行依賴版本鎖定,但是並沒有導入對應的依賴;如果我們工程需要那個依賴只需要引入依賴的 groupidartifactId 不需要定義 version

build 標籤中也對插件的版本進行了鎖定,如下圖

看完了父工程中 pom.xml 的配置後不難理解我們工程的的依賴爲什麼都沒有配置 version

1.2.1.2 探索依賴

在我們創建的工程中的 pom.xml 中配置瞭如下依賴

進入到該依賴,查看 pom.xml 的依賴會發現它引入瞭如下的依賴

裏面的引入了 spring-webspring-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 服務器

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章