SpringBoot快速入門(mén)及起步依賴(lài)解析(實(shí)例詳解)
一、SpringBoot簡(jiǎn)介
SpringBoot 是由 Pivotal 團(tuán)隊(duì)提供的全新框架,其設(shè)計(jì)目的是用來(lái)簡(jiǎn)化 Spring 應(yīng)用的初始搭建以及開(kāi)發(fā)過(guò)程。
使用了 Spring 框架后已經(jīng)簡(jiǎn)化了我們的開(kāi)發(fā)。而 SpringBoot 又是對(duì) Spring 開(kāi)發(fā)進(jìn)行簡(jiǎn)化的,可想而知 SpringBoot 使用的簡(jiǎn)單及廣泛性。既然 SpringBoot 是用來(lái)簡(jiǎn)化 Spring 開(kāi)發(fā)的,那我們就先回顧一下,以 SpringMVC 開(kāi)發(fā)為例:
1.創(chuàng)建工程,并在 pom.xml 配置文件中配置所依賴(lài)的坐標(biāo)

2編寫(xiě) web3.0 的配置類(lèi)
作為 web 程序,web3.0 的配置類(lèi)不能缺少,而這個(gè)配置類(lèi)還是比較麻煩的,代碼如下

3.編寫(xiě) SpringMVC 的配置類(lèi)

做到這只是將工程的架子搭起來(lái)。要想被外界訪問(wèn),最起碼還需要提供一個(gè) Controller 類(lèi),在該類(lèi)中提供一個(gè)方法。
4.編寫(xiě) Controller 類(lèi)

從上面的 SpringMVC 程序開(kāi)發(fā)可以看到,前三步都是在搭建環(huán)境,而且這三步基本都是固定的。SpringBoot 就是對(duì)這三步進(jìn)行簡(jiǎn)化了。接下來(lái)我們通過(guò)一個(gè)入門(mén)案例來(lái)體現(xiàn) SpingBoot 簡(jiǎn)化 Spring 開(kāi)發(fā)。
1.1 SpringBoot快速入門(mén)
1.1.1 開(kāi)發(fā)步驟
SpringBoot 開(kāi)發(fā)起來(lái)特別簡(jiǎn)單,分為如下幾步:
創(chuàng)建新模塊,選擇Spring初始化,并配置模塊相關(guān)基礎(chǔ)信息
選擇當(dāng)前模塊需要使用的技術(shù)集
開(kāi)發(fā)控制器類(lèi)
- 運(yùn)行自動(dòng)生成的Application類(lèi)
知道了 SpringBoot 的開(kāi)發(fā)步驟后,接下來(lái)我們進(jìn)行具體的操作,
1.1.1.1 創(chuàng)建新模塊
使用的是商用版的idea,所以沒(méi)有商業(yè)版idea的讀者了解一下即可,創(chuàng)建方式不止這一種
- 點(diǎn)擊
+選擇New Module創(chuàng)建新模塊

- 選擇
Spring Initializr,用來(lái)創(chuàng)建SpringBoot工程
以前我們選擇的是 Maven ,今天選擇 Spring Initializr 來(lái)快速構(gòu)建 SpringBoot 工程。而在 Module SDK 這一項(xiàng)選擇我們安裝的 JDK 版本。

- 對(duì)
SpringBoot工程進(jìn)行相關(guān)的設(shè)置
我們使用這種方式構(gòu)建的 SpringBoot 工程其實(shí)也是 Maven 工程,而該方式只是一種快速構(gòu)建的方式而已。

注意:打包方式這里需要設(shè)置為 Jar
- 選中
Web,然后勾選Spring Web
由于我們需要開(kāi)發(fā)一個(gè) web 程序,使用到了 SpringMVC 技術(shù),所以按照下圖紅框進(jìn)行勾選

- 下圖界面不需要任何修改,直接點(diǎn)擊
Finish完成SpringBoot工程的構(gòu)建

經(jīng)過(guò)以上步驟后就創(chuàng)建了如下結(jié)構(gòu)的模塊,它會(huì)幫我們自動(dòng)生成一個(gè) Application 類(lèi),而該類(lèi)一會(huì)再啟動(dòng)服務(wù)器時(shí)會(huì)用到

注意:
- 在創(chuàng)建好的工程中不需要?jiǎng)?chuàng)建配置類(lèi)
- 創(chuàng)建好的項(xiàng)目會(huì)自動(dòng)生成其他的一些文件,而這些文件目前對(duì)我們來(lái)說(shuō)沒(méi)有任何作用,所以可以將這些文件刪除。
可以刪除的目錄和文件如下:
.mvn.gitignoreHELP.mdmvnw
mvnw.cmd
1.1.1.2 創(chuàng)建 Controller
在 com.itheima.controller 包下創(chuàng)建 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 啟動(dòng)服務(wù)器
運(yùn)行 SpringBoot 工程不需要使用本地的 Tomcat 和 插件,只運(yùn)行項(xiàng)目 com.itheima 包下的 Application 類(lèi),我們就可以在控制臺(tái)看出如下信息

1.1.1.4 進(jìn)行測(cè)試
使用 Postman 工具來(lái)測(cè)試我們的程序

通過(guò)上面的入門(mén)案例我們可以看到使用 SpringBoot 進(jìn)行開(kāi)發(fā),使整個(gè)開(kāi)發(fā)變得很簡(jiǎn)單,那它是如何做到的呢?
要研究這個(gè)問(wèn)題,我們需要看看 Application 類(lèi)和 pom.xml 都書(shū)寫(xiě)了什么。先看看 Applicaion 類(lèi),該類(lèi)內(nèi)容如下:
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}這個(gè)類(lèi)中的東西很簡(jiǎn)單,就在類(lèi)上添加了一個(gè) @SpringBootApplication 注解,而在主方法中就一行代碼。我們?cè)趩?dòng)服務(wù)器時(shí)就是執(zhí)行的該類(lèi)中的主方法。
再看看 pom.xml 配置文件中的內(nèi)容
<?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>
<!--指定了一個(gè)父工程,父工程中的東西在該工程中可以繼承過(guò)來(lái)使用-->
<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>
<!--該依賴(lài)就是我們?cè)趧?chuàng)建 SpringBoot 工程勾選的那個(gè) Spring Web 產(chǎn)生的-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--這個(gè)是單元測(cè)試的依賴(lài),我們現(xiàn)在沒(méi)有進(jìn)行單元測(cè)試,所以這個(gè)依賴(lài)現(xiàn)在可以沒(méi)有-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
?
<build>
<plugins>
<!--這個(gè)插件是在打包時(shí)需要的,而這里暫時(shí)還沒(méi)有用到-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>我們代碼之所以能簡(jiǎn)化,就是因?yàn)橹付ǖ母腹こ毯?Spring Web 依賴(lài)實(shí)現(xiàn)的。具體的我們后面在介紹。
1.1.2 對(duì)比
做完 SpringBoot 的入門(mén)案例后,接下來(lái)對(duì)比一下 Spring 程序和 SpringBoot 程序。如下圖

坐標(biāo)
Spring程序中的坐標(biāo)需要自己編寫(xiě),而且坐標(biāo)非常多SpringBoot程序中的坐標(biāo)是我們?cè)趧?chuàng)建工程時(shí)進(jìn)行勾選自動(dòng)生成的web3.0配置類(lèi)
Spring程序需要自己編寫(xiě)這個(gè)配置類(lèi)。這個(gè)配置類(lèi)大家之前編寫(xiě)過(guò),肯定感覺(jué)很復(fù)雜SpringBoot程序不需要我們自己書(shū)寫(xiě)
配置類(lèi)
Spring/SpringMVC 程序的配置類(lèi)需要自己書(shū)寫(xiě)。而 SpringBoot 程序則不需要書(shū)寫(xiě)。
注意:基于Idea的 Spring Initializr 快速構(gòu)建 SpringBoot 工程時(shí)需要聯(lián)網(wǎng)。
1.1.3 官網(wǎng)構(gòu)建工程
在入門(mén)案例中之所以能快速構(gòu)建 SpringBoot 工程,是因?yàn)?Idea 使用了官網(wǎng)提供了快速構(gòu)建 SpringBoot 工程的組件實(shí)現(xiàn)的。那如何在官網(wǎng)進(jìn)行工程構(gòu)建呢?通過(guò)如下步驟構(gòu)建
1.1.3.1 進(jìn)入SpringBoot官網(wǎng)
官網(wǎng)地址如下:
https://spring.io/projects/spring-boot
進(jìn)入到 SpringBoot 官網(wǎng)后拖到最下方就可以看到如下內(nèi)容

然后點(diǎn)擊 Spring Initializr 超鏈接就會(huì)跳轉(zhuǎn)到如下頁(yè)面

這個(gè)頁(yè)面內(nèi)容是不是感覺(jué)很眼熟的,這和我們使用 Idea 快速構(gòu)建 SpringBoot 工程的界面基本相同。在上面頁(yè)面輸入對(duì)應(yīng)的信息
1.1.3.2 選擇依賴(lài)
選擇 Spring Web 可以點(diǎn)擊上圖右上角的 ADD DEPENDENCIES... CTRL + B 按鈕,就會(huì)出現(xiàn)如下界面

1.1.3.3 生成工程
以上步驟完成后就可以生成 SpringBoot 工程了。在頁(yè)面的最下方點(diǎn)擊 GENERATE CTRL + 回車(chē) 按鈕生成工程并下載到本地,如下圖所示

打開(kāi)下載好的壓縮包可以看到工程結(jié)構(gòu)和使用 Idea 生成的一模一樣,如下圖

而打開(kāi) pom.xml 文件,里面也包含了父工程和 Spring Web 的依賴(lài)。
通過(guò)上面官網(wǎng)的操作,我們知道 Idea 中快速構(gòu)建 SpringBoot 工程其實(shí)就是使用的官網(wǎng)的快速構(gòu)建組件,那以后即使沒(méi)有 Idea 也可以使用官網(wǎng)的方式構(gòu)建 SpringBoot 工程。
1.1.4 SpringBoot工程快速啟動(dòng)
1.1.4.1 問(wèn)題導(dǎo)入
以后我們和前端開(kāi)發(fā)人員協(xié)同開(kāi)發(fā),而前端開(kāi)發(fā)人員需要測(cè)試前端程序就需要后端開(kāi)啟服務(wù)器,這就受制于后端開(kāi)發(fā)人員。為了擺脫這個(gè)受制,前端開(kāi)發(fā)人員嘗試著在自己電腦上安裝 Tomcat 和 Idea ,在自己電腦上啟動(dòng)后端程序,這顯然不現(xiàn)實(shí)。
我們后端可以將 SpringBoot 工程打成 jar 包,該 jar 包運(yùn)行不依賴(lài)于 Tomcat 和 Idea 這些工具也可以正常運(yùn)行,只是這個(gè) jar 包在運(yùn)行過(guò)程中連接和我們自己程序相同的 Mysql 數(shù)據(jù)庫(kù)即可。這樣就可以解決這個(gè)問(wèn)題,如下圖

那現(xiàn)在問(wèn)題是如何打包呢?
1.1.4.2 打包
由于我們?cè)跇?gòu)建 SpringBoot 工程時(shí)已經(jīng)在 pom.xml 中配置了如下插件
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>所以我們只需要使用 Maven 的 package 指令打包就會(huì)在 target 目錄下生成對(duì)應(yīng)的 Jar 包。
注意:該插件必須配置,不然打好的 jar 包也是有問(wèn)題的。
1.1.4.3 啟動(dòng)
進(jìn)入 jar 包所在位置,在 命令提示符 中輸入如下命令
jar -jar springboot_01_quickstart-0.0.1-SNAPSHOT.jar
執(zhí)行上述命令就可以看到 SpringBoot 運(yùn)行的日志信息

1.2 SpringBoot概述
SpringBoot 是由Pivotal團(tuán)隊(duì)提供的全新框架,其設(shè)計(jì)目的是用來(lái)簡(jiǎn)化Spring應(yīng)用的初始搭建以及開(kāi)發(fā)過(guò)程。
大家已經(jīng)感受了 SpringBoot 程序,回過(guò)頭看看 SpringBoot 主要作用是什么,就是簡(jiǎn)化 Spring 的搭建過(guò)程和開(kāi)發(fā)過(guò)程。
原始 Spring 環(huán)境搭建和開(kāi)發(fā)存在以下問(wèn)題:
配置繁瑣
- 依賴(lài)設(shè)置繁瑣
SpringBoot 程序優(yōu)點(diǎn)恰巧就是針對(duì) Spring 的缺點(diǎn)
自動(dòng)配置。這個(gè)是用來(lái)解決
Spring程序配置繁瑣的問(wèn)題起步依賴(lài)。這個(gè)是用來(lái)解決
Spring程序依賴(lài)設(shè)置繁瑣的問(wèn)題
輔助功能(內(nèi)置服務(wù)器,...)。我們?cè)趩?dòng) SpringBoot 程序時(shí)既沒(méi)有使用本地的 tomcat 也沒(méi)有使用 tomcat 插件,而是使用 SpringBoot 內(nèi)置的服務(wù)器。
接下來(lái)我們來(lái)說(shuō)一下 SpringBoot 的起步依賴(lài)
1.2.1 起步依賴(lài)
我們使用 Spring Initializr 方式創(chuàng)建的 Maven 工程的的 pom.xml 配置文件中自動(dòng)生成了很多包含 starter 的依賴(lài),如下圖

這些依賴(lài)就是啟動(dòng)依賴(lài),接下來(lái)我們探究一下他是如何實(shí)現(xiàn)的。
1.2.1.1 探索父工程
從上面的文件中可以看到指定了一個(gè)父工程,按住ctrl鍵,點(diǎn)擊spring-boot-starter-parent我們進(jìn)入到父工程,發(fā)現(xiàn)父工程中又指定了一個(gè)父工程,如下圖所示

按住ctrl鍵,點(diǎn)擊spring-boot-dependencies再進(jìn)入到該父工程中,在該工程中我們可以看到配置內(nèi)容結(jié)構(gòu)如下圖所示

上圖中的 properties 標(biāo)簽中定義了各個(gè)技術(shù)軟件依賴(lài)的版本,避免了我們?cè)谑褂貌煌浖夹g(shù)時(shí)考慮版本的兼容問(wèn)題。在 properties 中我們找 servlet 和 mysql 的版本如下圖

dependencyManagement 標(biāo)簽是進(jìn)行依賴(lài)版本鎖定,但是并沒(méi)有導(dǎo)入對(duì)應(yīng)的依賴(lài);如果我們工程需要那個(gè)依賴(lài)只需要引入依賴(lài)的 groupid 和 artifactId 不需要定義 version。
而 build 標(biāo)簽中也對(duì)插件的版本進(jìn)行了鎖定,如下圖

看完了父工程中 pom.xml 的配置后不難理解我們工程的的依賴(lài)為什么都沒(méi)有配置 version。
1.2.1.2 探索依賴(lài)
在我們創(chuàng)建的工程中的 pom.xml 中配置了如下依賴(lài)

進(jìn)入到該依賴(lài),查看 pom.xml 的依賴(lài)會(huì)發(fā)現(xiàn)它引入了如下的依賴(lài)

里面的引入了 spring-web 和 spring-webmvc 的依賴(lài),這就是為什么我們的工程中沒(méi)有依賴(lài)這兩個(gè)包還能正常使用 springMVC 中的注解的原因。
而依賴(lài) spring-boot-starter-tomcat ,從名字基本能確認(rèn)內(nèi)部依賴(lài)了 tomcat,所以我們的工程才能正常啟動(dòng)。
結(jié)論:以后需要使用技術(shù),只需要引入該技術(shù)對(duì)應(yīng)的起步依賴(lài)即可,不需要定義 version
1.2.1.3 小結(jié)
starter
SpringBoot中常見(jiàn)項(xiàng)目名稱(chēng),定義了當(dāng)前項(xiàng)目使用的所有項(xiàng)目坐標(biāo),以達(dá)到減少依賴(lài)配置的目的
parent
- 所有
SpringBoot項(xiàng)目要繼承的項(xiàng)目,定義了若干個(gè)坐標(biāo)版本號(hào)(依賴(lài)管理,而非依賴(lài)),以達(dá)到減少依賴(lài)沖突的目的 spring-boot-starter-parent(2.5.0)與spring-boot-starter-parent(2.4.6)共計(jì)57處坐標(biāo)版本不同,所以在實(shí)際的項(xiàng)目開(kāi)發(fā)中,一般不會(huì)使用最新的版本,而是使用最合理的版本
實(shí)際開(kāi)發(fā)
使用任意坐標(biāo)時(shí),僅書(shū)寫(xiě)GAV中的G和A,V由SpringBoot提供
G:groupid
A:artifactId
V:version
- 如發(fā)生坐標(biāo)錯(cuò)誤,再指定version(要小心版本沖突)
1.2.2 程序啟動(dòng)
創(chuàng)建的每一個(gè) SpringBoot 程序時(shí)都包含一個(gè)類(lèi)似于下面的類(lèi),我們將這個(gè)類(lèi)稱(chēng)作引導(dǎo)類(lèi)
@SpringBootApplication
public class Springboot01QuickstartApplication {
public static void main(String[] args) {
SpringApplication.run(Springboot01QuickstartApplication.class, args);
}
}注意:
SpringBoot在創(chuàng)建項(xiàng)目時(shí),采用jar的打包方式SpringBoot的引導(dǎo)類(lèi)是項(xiàng)目的入口,運(yùn)行main方法就可以啟動(dòng)項(xiàng)目
因?yàn)槲覀冊(cè)?pom.xml 中配置了 spring-boot-starter-web 依賴(lài),而該依賴(lài)通過(guò)前面的學(xué)習(xí)知道它依賴(lài) tomcat ,所以運(yùn)行 main 方法就可以使用 tomcat 啟動(dòng)咱們的工程。
1.2.3 切換web服務(wù)器
現(xiàn)在我們啟動(dòng)工程使用的是 tomcat 服務(wù)器,那能不能不使用 tomcat 而使用 jetty 服務(wù)器,而要切換 web 服務(wù)器就需要將默認(rèn)的 tomcat 服務(wù)器給排除掉,怎么排除呢?使用 exclusion 標(biāo)簽
<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>現(xiàn)在我們運(yùn)行引導(dǎo)類(lèi)可以嗎?運(yùn)行一下試試,打印的日志信息如下

程序直接停止了,為什么呢?那是因?yàn)榕懦?tomcat 服務(wù)器,程序中就沒(méi)有服務(wù)器了。所以此時(shí)不光要排除 tomcat 服務(wù)器,還要引入 jetty 服務(wù)器。在 pom.xml 中因?yàn)?jetty 的起步依賴(lài)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>接下來(lái)再次運(yùn)行引導(dǎo)類(lèi),在日志信息中就可以看到使用的是 jetty 服務(wù)器

到此這篇關(guān)于SpringBoot快速入門(mén)及起步依賴(lài)解析的文章就介紹到這了,更多相關(guān)SpringBoot起步依賴(lài)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- springboot集成測(cè)試容器重啟問(wèn)題的處理
- SpringBoot2 集成測(cè)試組件的七種方法
- 基于SpringBoot集成測(cè)試遠(yuǎn)程連接Redis服務(wù)的教程詳解
- Spring Boot 單元測(cè)試和集成測(cè)試實(shí)現(xiàn)詳解
- springboot項(xiàng)目中引入本地依賴(lài)jar包并打包到lib文件夾中
- 一篇文章徹底弄懂SpringBoot項(xiàng)目jdk版本及依賴(lài)不兼容問(wèn)題
- SpringBoot項(xiàng)目依賴(lài)和配置最新示例講解
- springboot集成測(cè)試最小化依賴(lài)實(shí)踐示例
相關(guān)文章
JAVA中String介紹及常見(jiàn)面試題小結(jié)
這篇文章主要介紹了JAVA中String介紹及常見(jiàn)面試題,在java面試中經(jīng)常會(huì)被面試官問(wèn)到,小編通過(guò)實(shí)例代碼相結(jié)合給大家詳細(xì)介紹,需要的朋友可以參考下2020-02-02
一文帶你了解Java萬(wàn)物之基之Object類(lèi)
Java是一門(mén)天然的面向?qū)ο蟮恼Z(yǔ)言。而所有我們手動(dòng)創(chuàng)造出來(lái)的類(lèi),都繼承于同一個(gè)類(lèi),即Object類(lèi)。本文將通過(guò)示例為大家詳細(xì)介紹一下Java中的Object類(lèi),需要的可以參考一下2022-03-03
Guava事件總線應(yīng)用場(chǎng)景最佳實(shí)踐
這篇文章主要為大家介紹了Guava事件總線應(yīng)用場(chǎng)景最佳實(shí)踐,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
Java利用future及時(shí)獲取多線程運(yùn)行結(jié)果
在Java編程中,有時(shí)候會(huì)需要及時(shí)獲取線程的運(yùn)行結(jié)果,本文就通過(guò)一個(gè)相關(guān)實(shí)例向大家介紹Java利用future及時(shí)獲取線程運(yùn)行結(jié)果的方法,需要的朋友可以參考。2017-10-10
Java8?lambda表達(dá)式的10個(gè)實(shí)例講解
這篇文章主要介紹了Java8?lambda表達(dá)式的10個(gè)實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
關(guān)于Spring啟動(dòng)時(shí)Context加載源碼分析
這篇文章通過(guò)源碼分析主要給大家介紹了關(guān)于Spring啟動(dòng)時(shí)Context加載的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-01-01
Java?GUI實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Java?GUI實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01
Eclipse中如何引入JUnit進(jìn)行單元測(cè)試
這篇文章主要介紹了Eclipse中如何引入JUnit進(jìn)行單元測(cè)試問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04

