做一個幸福的人,其實是一件很酷的事情,因為它是你需要真正的生活哲學。我覺得那樣的人才是真正的一個成功人,不去討生活,生活有時會討好你自己。做幸福的人,比成功更酷。--------李健
SpringToolSuite4(STS)是用來執行SpringBoot項目IDE開發工具,下面從0開始搭建一個Springboot啟動案例。
0.為什么去使用SpringBoot:
SpringBoot是一個快速開發框架,快速的將一些常用的第三方依賴整合(原理:通過Maven子父工程的方式),簡化XML配置,全部采用注解形式,內置Http服務器(Jetty和Tomcat),最終以java應用程序進行執行。
SpringBoot核心原理:(SpringBoot官網地址為:https://spring.io/projects/spring-boot)
- 基於SpringMVC無配置文件(純Java)完全注解化+內置tomcat-embed-core實現SpringBoot框架,Main函數啟動。
- SpringBoot核心快速整合第三方框架原理:Maven繼承依賴關系。
1)輕松依賴管理:起步依賴(Stater Dependency)-項目創建時自動(底層幫你)關聯依賴。
在使用 Spring 的時候,需要在 pom.xml 文件中添加多個依賴,而 Spring Boot 則會幫助開發着快速啟動一個 web 容器,在 Spring Boot 中,我們只需要在 pom 文件中添加如下一個 starter-web 依賴即可。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
我們點擊進入該依賴后可以看到,Spring Boot 這個 starter-web 已經包含了多個依賴,包括之前在 Spring 工程中需要導入的依賴,我們看一下其中的一部分,如下:
<!-- .....省略其他依賴 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>5.0.7.RELEASE</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.0.7.RELEASE</version> <scope>compile</scope> </dependency>
2)自動化的配置:自動配置(Auto Configuration)-即系統底層幫你自動配置。
Spring 雖然使Java EE輕量級框架,但由於其繁瑣的配置,一度被人認為是“配置地獄”。各種XML、Annotation配置會讓人眼花繚亂,而且配置多的話,如果出錯了也很難找出原因。Spring Boot更多的是采用 Java Config 的方式,對 Spring 進行配置。
3)健康檢查(Actator)-監控:
比如有時,我們在瀏覽器里輸入一個地址,找不到服務器端的資源,可以打開監控查看那個地址有沒有對應的資源。比如說,我想去監控一下,我們這個Bean對象(Spring容器管理的資源,我們都稱之為是bean),這個bean對象沒有,可以打開監控查看。
4)嵌入式的Servlet容器支持:應用無需打成WAR包。
在使用 Spring 時,項目部署時需要我們在服務器上部署 tomcat,然后把項目打成 war 包扔到 tomcat里,在使用 Spring Boot 后,我們不需要在服務器上去部署 tomcat,因為 Spring Boot 內嵌了 tomcat,我們只需要將項目打成 jar 包,使用 java -jar xxx.jar一鍵式啟動項目。
5)對SpringBoot的理解:
SpringBoot對SSM框架的整合實現了自動化(添加依賴,配置文件以及映射文件),無需程序員自己去寫,只要選擇用誰即可,SpringBoot會自動匹配相應的版本及配置,避免了一些框架的版本沖突問題,
和各種配置文件的繁瑣操作。比如現在要使用Spring框架,就緒需要通過寫配置文件(spring.xml)的方式去配置,要么就去寫注解(@annotation)的方式去配置,那這個過程就會變的比較麻煩。
所以就想,能不能把這些對於初學者來講,搭建環境的這個過程,進行一個更好的簡化,讓他們的精力放在,具體的業務的實現上面去,那對於一些高手來講,他們幫你把依賴做好,他們幫你把配置做好,
那初學者只是在這個平台上面去寫你的業務代碼就可以了。就類似於我現在想去學開車,車,別人幫你去做好了,也就是說,人家肯定得去幫你把車設計好,把車里面各個組件幫你組裝好。
生產完了以后,對外輸出一輛車,我只要學會去開就可以了,SpringBoot就是這樣一種思想。
在將來java程序員入門會越來越容易,因為現成的工具,現成的框架越來越多,使用框架最重要的一點就是掌握規則,基於規則去寫代碼,你就會感覺越來越簡單。對於框架的學習,在於應用,而不是去理解,
無論SpringBoot,還是SpringCloud,框架都不是我們設計的,要先會用,而他們里面的設計精髓原理,這是一個長期的,耗時的一個過程,需要逐步加強。SpringBoot的底層原理和設計思想,
所涵蓋的內容已經非常之龐大,絕非短期內可以掌握。
現在的軟件市場已經形成了一定的規模,在這種規模下面,系統架構的復雜度也越來越高(從早期的單體架構,再到后面的SOA(Service-Oriented Architecture)分布式架構,再到我們現在的微服務式架構)。可以說呢,
這個軟件體系的架構正在發生着很大的變化,在這種變化中,
(1)從企業方面而言,企業現在更注重技術的開箱即用,拿來即用,如果想把所有的技術都精通,不是不可以,可能需要好長時間,至少得8-10年的時間,現在想精通每一項技術,這是不可能的,
所以初始學習框架應該站在應用的角度,然后逐步地去理解設計原理,但是設計原理是一個長期積累的過程,如果對設計原理感興趣,想做設計者,就不得不懂原理,但是,不是說一下就把原理都要學透,學明白,很難。
那我們現在呢,很多很多的這種平台,都更注重於技術在這個生態圈的一種生態的融合,深度的融合,更注重輕量級的這種運維,所以運維就更簡單,自動化,就現在的運維就指的什么意思啊,
不用我們流水線上的工人,天天盯在那,不用看着這個CPU多少多少了,這個磁盤是不是太燙了,這個網絡出現擁堵了,不用人工去盯着這件事情,完全由系統來去做,那么這個過程就叫做輕量級的運維。
那么如何實現,SpringBoot在一定程度上,可以去簡化我們項目構建的這個過程,而我們程序員在把精力提取出來,更多的集中在業務開發上。
(2)從技術方面而言,即在這種分布式架構,或在這種微服務架構當中,已經不是一個JVM的問題了,可能會涉及到多個JVM,多個服務,對外再提供一個統一的這樣一種產品,就類似於天貓商城,京東商城,
那么對外輸出的是一個電子商務系統,一個電商系統,但是對於這個電商系統來講,它是一個產品,支持這個產品的后面的服務,會有很多,比如說有商品服務,訂單服務,還有推薦服務,搜索服務,購物車服務,
庫存服務,積分服務等等,其實嚴格來講,它把每一塊業務,都理解成是對外的一個服務,為什么叫微服務呢,支付是服務,搜索是服務,積分是服務,它把所有的系統,看成是一個一個的服務,
把每一個服務單獨部署在不同的JVM上,然后這么多的JVM,再對外去支撐統一的一個產品,比方說一個電子商務系統,所以現在的架構越來越復雜,在這種比較復雜的這種架構當中,
如果想提高我們開發的效率,簡化配置過程,簡化資源加載過程,那我們就需要有一種技術,那這種技術,現在在這個行業里面誕生了,就叫SpringBoot,也許將來可能會有其他的一些產品,
淘汰SpringBoot,但是至少現在SpringBoot是我們目前這個市場當中,去構建我們項目,簡化項目依賴,部署自動化配置的,一個非常有效的項目腳手架,或者叫架子工。
SpringBoot構建於SpringFramework的基礎之上,它是基於快速構建的理念,提供了自動配置,程序員只需要根據自身的業務去配置特定的少量數據,從而簡化了配置工作,
而那些公共的配置信息則由框架底層的設計人員,他們已經把這些公共的配置,依賴幫我們做好了,我們只需要在這個配置和依賴之上寫自己的業務即可.
1 准備工作
(1)下載JDK1.8(綠色版,解壓即可!),並進行環境變量配置(只配置JAVA_HOME指明jdk完整路徑即可,CLASSPATH不用也行!)
(2)下載最新maven(例如apache-maven-3.6.3,網址http://maven.apache.org/)並解壓。
(3)下載sts最新版(例如sts-4.4.5.RELEASE,網址https://spring.io/tools)並解壓(此網站新版本下載下來時是一個.jar文件,需要在jar文件所在的目錄中,以命令行方式執行 "java -jar 下載的文件名" 的方式進行解壓,
這個STS程序被放到了jar包中了,可以以java -jar命令的這種方式執行。如圖所示(需要首先啟動系統自帶的命令行客戶端,然后切換到軟件所在目錄,cd指令為切換目錄的意思)。
建議:將下載的所有文件存儲到同一目錄並解壓,例如d:/java/(輔助軟件)和d:/tools/(開發軟件)目錄。要求目錄不要有中文,也不要有特殊符號(例如&等)。另外,在啟動sts時, 會要求指定新的工作空間:定義新的工作區(要求沒有中文目錄),例如e:/TCGBIII/CGBWORKSP。
2 Maven基本配置
打開maven中的setting.xml文件,並對其如下選項進行配置。
- 配置maven本地庫(從maven遠程服務器下載的資源存儲到的位置):可以自定義位置,比如C盤、D盤、E盤皆可。如果沒有指定位置的目錄,在創建項目時會自動生成。
<localRepository>${user.home}/.m3/repository</localRepository> |
其中,(1)${user.home}:表示當前用戶所在的目錄(建議就放在當前系統用戶這個目錄下:官方一般建議就采用這種方式${user.home});
(2).m3/repository:默認情況下是 .m2/repository,建議配置自己的maven本地庫,而非默認本地庫,比如改成.m3/repository;
(3)盡量不用maven默認的存儲位置.m2;也盡量不要用自己以前的本地庫,因為以前的本地庫里面可能已經存在一些依賴,容易產生依賴沖突.
- 配置maven私服鏡像服務器地址(配置到mirrors標簽內部)。可以不配置,不配置默認使用的是maven的公服
<mirror> <id>aliyun</id> <name>aliyun for maven</name> <mirrorOf>*</mirrorOf> <url>https://maven.aliyun.com/repository/public</url> </mirror>
注:此處是連接aliyun的maven鏡像,其中,id,name和url子標簽是固定寫法,mirrorOf子標簽的內容可以自定義。
- 配置maven中的profile(配置到profiles標簽內部),設置JDK編譯和運行版本。(profile詳細講解:推薦:https://www.cnblogs.com/0201zcr/p/6262762.html)
<profile> <id>jdk-1.8</id> <activation> <activeByDefault>true</activeByDefault> <jdk>1.8</jdk> </activation> <properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion> </properties> </profile>
只配置以上內容即可,其它相關配置暫不理解,但不配置的話應不影響。。。
3 STS整合maven配置
(1) 啟動STS工具:
(2) Maven Installations配置Maven環境:Window--Preferences--Maven--Installations--Add:找到maven所在路徑,加載進來后勾選,Apply即可。
(3) Maven User Settings配置(用戶Settings和全局Settings可以改成一樣的):Maven Installations配置:Window--Preferences--Maven--User Settings。
4 STS工具使用的基本設置與優化:
現在不管是STS,還是IDEA,它們占用的資源都比較多,比較吃內存,所以可以關掉一些不必要的功能,節約內存。
(1) 項目工作區編碼設置:Window--Preferences--General--Workspace(或者搜索work),編碼改為UTF-8。統一編碼格式,方便外部UTF8的項目文件導入后的編解碼不一致。
(2) 禁用拼寫檢查(拼寫時的錯誤提示功能),取消圖中所示的拼寫檢查選項。
(3) 取消圖中所示的超連接選項配置。防止在賦值粘貼時出現卡頓現象(基於自己的選擇,也可以查閱相關資料,進一步優化)。
(4)關掉圖中的校驗功能(比較校驗xml中的標簽嵌套格式錯誤): 校驗的內容太多會比較慢,干脆就不校驗了(憑經驗自行檢查),把沒必要的校驗關掉。
(5) 關掉自動更新功能(每隔一段時間開發工具就會自動更新,通過網絡去下載,沒有必要讓它自動更新,也可以關掉):Window--Preferences--Install/Update--Automatic Updates,如圖所示:
(6) 和啟動選項相關的一些配置Startup and Shutdown,基於實際的需求可改,可不改,比如我們根本就不需要Gradle,可以去掉。
(7) 修改STS工具內存配置,打開SpringToolSuite4.ini文件(在STS安裝目錄中),修改堆大小,如圖所示:
其中,默認情況下,Xms是最小堆內存,Xmx是最大堆內存;這個STS的內存配置,假如內存足夠大,比如8個G,可以把Xms最小堆內存改大一點,1024m,或者16G內存,那Xms和Xmx都設置為2048m;如果內存是4G的,也建議至少改成512m;
理論上講,改了這個配置,內存中可以存儲的對象就多些,就不用每創建幾個對象,系統底層的JVM就幫我們啟動一個GC垃圾回收,啟動GC的話,它會占用很多的時間,那么它會導致短時間的暫停,所以此處可以基於自己電腦的一個實際的情況去修改這個內存的配置。
比如說,Xms和Xmx都改為2048m。改完以后, 關掉STS,然后重啟打開,如果改完以后,能夠啟動起來即可。
5 項目創建及結構分析
打開STS 集成開發工具,創建spring boot項目,其具體步驟如下:
第一步:Create new Spring Starter Project:
打開項目新建窗口(快捷鍵ctrl+n), 搜索spring,選擇spring starter 項目,點擊Next。如圖所示:
第二步:填寫項目基本信息:New Spring Starter Project。
(1)Service URL:https://start.spring.io,項目構建資源地址,必須聯網才可以。如果長時間無法連接資源網址,就會出現異常:SocketTimeoutException:connect timed out
(1.1)默認訪問URL:https://start.spring.io/,服務器是架在國外的,網絡較慢,國內可以選擇阿里雲鏡像資源網址:https://start.aliyun.com/,但可以通過在瀏覽器訪問該網址檢查網站是否可以正常訪問。
(1.2)因為https://start.spring.io/,服務器是架在國外的,國外的外網服務器能夠同時支撐的並發量是有限的,全球創建SpringBoot都在用這個,一旦網路阻塞就一定連不上,或者國外限速了,也可以利用谷歌訪問助手等插件嘗試訪問;
基於以上原因,這就是國內阿里雲要提供https://start.aliyun.com/,為什么我們要配置一個maven私服,而不去用maven公服,比如可以用阿里雲的,https://start.aliyun.com/bootstrap.html,創建SpringBoot項目,
但是阿里雲這個鏡像服務器,它相對於Spring官網的服務器來講,在版本上會有一些滯后,比如start.spring.io官網已經推出的最新release版,是2.3.2,像2.4.0(SNAPSHOT)或2.4.0(M1),是還沒有寫好的開發版,
但是在start.aliyun.com,就沒有2.3.2,只更新到2.3.0的release版,那如果就想用阿里雲的,就只能有2.3.0的SpringBoot版本。
(2)Use default location: 此處如果無需上傳外部倉庫,可以使用默認位置路徑,無需改動,如果要上傳到遠程服務器,比如gitee托管平台,可以更改下保存的路徑地址,然后后面加上新創建的項目名稱.比如:
(3)項目的構建方式選擇Maven;項目的打包方式選擇Jar包方式;jdk的版本根據需求選擇,比如jdk8;語言選擇Java語言;
(4)組名ID:com.cy(一般是公司域名的倒寫);項目名稱:CGB-SBOOT-01;項目描述Description和啟動類所在包目錄Package,選擇默認即可。
(5)Working sets默認即可。
(6)如果無法連接URL網路地址,就只能看到第一部分,第二部分和第三部分不會顯示出來。即出現異常:SocketTimeoutException:connect timed out,如圖所示:
第三步:選擇Spring Boot版本,及其所需要的依賴。New Spring Starter Project Dependencies.
(1)Spring Boot Version:根據個人項目需求選擇對應SpringBoot版本,Available可以選擇需要使用到的依賴。
(2)Fiequently Used:最近使用過的一些依賴,如果是第一次創建SpringBoot項目,可能不會顯示此處內容:
(3)選擇好指定版本,及其依賴(構建SpringBoot的第一個項目,暫時這里不選擇任何依賴),直接點擊Finish完成,如圖所示:
第四步:等待項目構建和起步依賴的加載。
(1)在第三步New Spring Starter Project Dependencies.點擊Finish之后,項目便開始從maven配置中指定的私服服務器(例如阿里雲的maven服務器)去下載起步依賴(SpringBoot項目中默認指定了項目啟動時需要的一些jar包依賴)。
(2)在項目依賴下載的這個過程可能會比較耗時(網絡最好不要用手機網絡,會導致很多資源下載不下來),如果下載時間比較長,可以用之前下載好的本地庫repository,替換現在的本地庫,但需要對應的SpringBoot的版本一致才可以:
(3)假如指定版本的springboot項目以前創建過,它會默認先從本地庫查找,假如本地庫沒有,則從遠程庫(網絡)去下載(如果之前下載過依賴,即本地可以有這個依賴,那項目構建速度也會很快)。項目創建成功以后,其包視圖(Package Explorer)結構,如圖所示:
其中,在圖-13呈現的CGB-SBOOT-01項目結構中,所有的類和配置文件都是創建好項目以后,由STS工具幫我們自動創建的。
注意:如果以上步驟都正確,創建項目后,目錄結構不全,或pom.xml文件報錯,或者兩種情況同時存在,基本是Maven的資源取不下來,可以選中項目,右鍵,強制MavenUpdate。
或者沿用之前不同版本的SpringBoot的maven庫,以及其他非SpringBoot的maven,從而產生依賴沖突導致jar包無法下載,具體見問題分析。
第五步:找到項目的入口類(使用了@SpringBootApplication注解描述),然后運行啟動類,檢測啟動過程,SpringBoot在啟動時,控制台會出現如圖標識:
至此,sts開發工具及其所需的基本環境jdk和maven配置成功:可以開始你的show了!
SpringBoot項目創建方式二:
除了通過開發工具STS創建SpringBoot項目,還可以通過網址創建SpringBoot項目,比如通過spring官網 https://start.spring.io/,或者通過阿里雲鏡像 https://start.aliyun.com/bootstrap.html,
(1)選擇項目Project:Maven Project,語言Language:Java,然后后面選擇SpringBoot的版本,2.3.2;
(2)Project Metadata:
組ID,Group:com.cy;項目名稱Artifact:CGB-SPRINGBOOT-00;包名Package name:com.cy;打包方式Packaging:Jar;Java版本,Java:8;Name和Description默認即可。
(3)最后點擊GENERATE即可,網站會自動生成一個SpringBoot的Maven項目並下載,下載下來,導入我們的STS工具即可。這也是創建項目的一種方式。如圖所示:
(4)下載后文件,可以移動到指定目錄,或者直接解壓到指定目錄:
(5)導入通過網頁生成的此項目,操作如下:打開STS選擇File--Import--Maven--Existing Maven Projects:
(6)可以選擇Add project(s) to working set,將這個項目添加到工作區,添加一個工作區的配置。當然不選也行,也沒有問題:
(8)生成項目如下:與STS工具生成的項目效果是一樣的。
SpringBoot項目創建方式三:
如果網絡就是連接不上,也可以通過創建一個普通的Maven項目+pom.xml的方式,自行構建SpringBoot項目結構。
(1)首先創建一個普通的Maven項目:
勾選創建一個簡單的Maven項目
填寫如下選項的對應信息,其他可默認為空。
(2)把之前已經創建好的SpringBoot的項目pom.xml的所有內容復制,粘貼到普通Maven項目的pom.xml文件中,注意,需要把項目artifactId和name兩個標簽的名稱改為當前項目名稱,否則項目根文件可能報紅叉。
<?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.3.2.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.cy</groupId> <artifactId>CGB-SPRINGBOOT-01</artifactId> <version>0.0.1-SNAPSHOT</version> <name>CGB-SPRINGBOOT-01</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
(3)選中這個普通的Maven項目,右鍵,選Maven,UpdateProject,勾選強制更新選項,最后OK即可,SpringBoot項目創建完成。
(4)以上步驟完成以后,我們自己手動創建的普通Maven項目構建出來的SpringBoot工程中,src里面是沒有自動生成的 包和類,以及配置文件,即沒有啟動類,application.properties配置文件等資源,
我們也可以自己手動去創建這些必要的項目目錄與結構,可以直接拷貝已有的SpringBoot工程的目錄結構,或者自己去隨便寫一個啟動類,類名無所謂,但是啟動類要求必須被注解@SpringBootApplication描述,
並且類的內部需要有一個main方法,在這個main方法里面,需要調用SpringApplication.run(Application.class, args); 這個方法,並傳入當前啟動類對象的實例,比如:
SpringBoot啟動類結構如下:
package com.cy; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Application implements { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
(5)最后再src/main/resources目錄下,直接拷貝一份SpringBoot指定的配置文件,application.properties,或者自行創建一個同名文件即可,如果是一個純凈的SpringBoot功能,配置文件里面可以是沒有任何內容的(文件左側會顯示一個小葉子)。
提示: 我們通過Spring官網生成的,或通過STS工具訪問spring官網生成的SpringBoot項目,SpringBoot的配置文件application.properties中,是沒有任何內容的,但是如果是通過STS訪問阿里雲的http://start.aliyun.com 生成的SpringBoot項目的配置文件內部是有內容的,
它默認給我們指定了一些配置,這個配置不是我們需要的,比如說給項目起個名字,用到了jmx,用到了健康檢查等,可以把它里面的內容清掉,留着它們也沒有關系,不會有什么影響,內容如下:
spring.application.name=CGB-SPRINGBOOT02 management.endpoints.jmx.exposure.include=* management.endpoints.web.exposure.include=* management.endpoint.health.show-details=always # spring cloud access&secret config # 可以訪問如下地址查看: https://usercenter.console.aliyun.com/#/manage/ak alibaba.cloud.access-key=**** alibaba.cloud.secret-key=****
SpringBoot項目創建方式四:基於已有的SB項目拷貝
基於原有的SpringBoot項目復制粘貼,Ctrl+C、Ctrl+V:
注意:此拷貝原有項目方式,需要更改pom.xml中的artifactId和name兩個標簽的名稱改為當前項目名稱,並通過MavenUpdateProject強制更新,否則項目根文件可能報紅叉。
項目結構分析:應遵守如下規則
(1)任何一個項目在啟動的時候都需要有一個入口,項目中被注解@SpringBootApplication描述的類就是SpringBoot項目的入口,稱其為啟動類上,一個項目有且只能有一個啟動類,可以通過此類啟動SpringBoot項目;
(2)自己寫的類,一定要放在啟動類所在的包,或者是其子包中,有了啟動類以后,因為后面我們可能有些資源要交給Spring去管理,所以自己寫的類不要放到其他的包里面;
(3)這個src/main/resources目錄下,一定放的是我們的配置文件,及其以后可能還有一些靜態資源;
(4)這個src/main/resources目錄下,有SpringBoot自帶的一個默認的配置文件application.properties,一般在創建一個項目的時候,這個配置文件沒有任何內容,我們SpringBoot項目的配置都會寫在這里;
(5)這個src/test/java目錄下,如果有一些單元測試類,單元測試類就放在這個目錄下,另外,測試目錄下也有一個測試的啟動類,其上被注解@SpringBootTest描述,表示把這個類交給Spring去管理,單元測試類所在的包,最好也是測試的啟動類所在的包,或者是其子包中。
(1)啟動類內部有一個main方法,main方法內部有一段代碼,SpringApplication.run(Application.class, args);,其含義是加載SpringBoot指定資源,這些資源無非就是一些class文件或者properties配置文件等,
因為我們得讀配置文件,並加載類到內存中,即底層要去加載你的Class文件到內存,那么要基於我們這個properties給對象做一定的配置。
package com.cy; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Application { public static void main(String[] args) { //加載springboot指定資源(.class,.properties,...) SpringApplication.run(Application.class, args); } }
(2)測試目錄下的啟動類,使用@SpringBootTest描述的類,稱其為單元測試類,類的內部有一個單元測試方法,被注解@Test描述,SpringBoot默認引入的是JUnit5的包,即org.junit.jupiter.api.Test,如果引用JUnit4中的@Test注解描述可能會有些問題。
package com.cy; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; /** * SpringBoot工程中的單元測試類,使用 * @SpringBootTest 注解進行描述 */ @SpringBootTest class ApplicationTests { @Test void contextLoads() { } }
(3)這個JRE System Library[JavaSE-1.8],建議選擇Window--Preferences--Java--Installed JREs:
這里用到的是jdk,建議這里用的是jdk,而不是在這里選擇的是jre,否則后面有些源代碼可能打不開,關聯不上,就無法去看源碼的設計思想,所以這個位置一定要關聯的是jdk的一個位置。
(4)這個Maven Dependencies,我們沒有自己添加依賴,默認情況下,這個項目里就有很多依賴,我們只選擇了一個SpringBoot的版本,SpringBoot相關的一些依賴,也就是一些基礎平台,就幫我們下載好了。
為什么在創建項目時,有時會比較慢,就是因為在創建項目時,SpringBoot默認會把很多依賴幫我們下載下來,而不用我們自己去選擇,這個特性就是SpringBoot當中的起步依賴,或者說啟動依賴特性,
創建項目時,我們還沒有指定依賴,SpringBoot就會幫我們下載很多依賴,比如Spring的依賴,slf4j的依賴,json的依賴,junit的依賴等等。這就是SpringBoot工程的特點,它幫我們把很多資源配置好,
把項目中要用到的一些基礎依賴,幫我們做了一個版本的設計,兼容性的配置。
(5)對於src來講,其src/main/java,src/main/resources,src/test/java,都這些資源里面的內容,在編譯的時候,其實都在src目錄下,但是在src目錄展開是看不到的,它沒有顯示具體的資源。
(6)對於target來講,我們src中的目錄下的所有.java程序,編譯生成的.class文件,及其src/main/resources目錄下的配置文件,編譯后,都會生成到target目錄下,那些.class文件就會存儲在這個target目錄下,
可以通過,選擇項目右鍵--Show In--System Explorer:就可以打開項目所在的本地目錄。
(7)對於pom.xml文件,其中有一個parent標簽:表示我們當前創建的項目,繼承於SpringBoot當中給定的 org.springframework.boot 的 spring-boot-starter-parent 這個項目,parent標簽表示maven里項目之間的繼承關系,我們的一些maven依賴,版本的一些配置,
都是在parent所依賴的這個工程中指定的。
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.2.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent>
pom.xml文件中,其他的信息是我們自己項目中的信息,SpringBoot項目里面只指定了下面兩個資源依賴,spring-boot-starter和spring-boot-start-test,我們創建SpringBoot項目時,工具自動幫我們創建的,其它的依賴是沒有在pom.xml文件中指定的,
但是我們MavenDependencies有那么多的依賴,那沒有的那些依賴在哪呢,就在parent標簽依賴的父級工程里面,可以通過Ctrl點擊,進入parent標簽引入項目的子文件,org.springframework.boot:spring-boot-starter-parent:2.3.2.RELEASE.pom,
再按住Ctrl點擊這個文件中的parent,進入到org.springframework.boot:spring-boot-dependencies:2.3.2.RELEASE.pom,就會發現這個文件中有很多的版本,很多依賴,SpringBoot這個工程底層都幫我們已經做好了,這個是別人已經幫我們設計好的這些版本,而不需要我們自己設計的,
所以就算我們沒有指定依賴的版本,SpringBoot也會幫我們去下載對應版本的這些依賴。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency>
注意:項目上如果有問號,是因為配置了Git環境,表示本地代碼倉庫,有未同步的代碼,如果代碼只在本地保存就不會有問號。
問題分析:
1.創建項目時網絡連接超時:
STS默認有一個超時時間,如果超過這個時間無法連接上服務器,就會拋出異常,SocketTimeoutException:connect timed out.
可能導致超時的原因如下:
(0)我們在創建SpringBoot項目時,New Spring Starter Project,使用https://start.spring.io/ 也好,還是使用阿里雲的https://start.aliyun.com/ 也好,可能有的時候因為外網的服務器不穩定,所以我們有時候在這里的鏈接就訪問不了。
(1)域名解析問題(與當地的域名服務器有關)
打開,控制版面--打開網絡和共享中心--本地連接、打開本地連接,狀態窗口--屬性:雙擊,Internet 協議版本 4 (TCP/IPv4):在使用下面的 DNS服務器地址欄中,有首選DNS服務器和備用DNS服務器,
可以在此處配置自己電腦使用的DNS配置信息,默認是自動獲得DNS服務器地址。如果要上外網就都會有一個DNS的配置,計算機的唯一標識就是IP地址,而一台計算機上有很多的應用,這些應用在這台計算機上的唯一標識,就是端口號。
比如可以基於80端口找到tomcat,Tomcat的默認啟動端口是80,在瀏覽器輸入一個域名,比如www.baidu.com,這個域名會通過DNS服務器解析,把域名解析成IP地址,最終找到網絡上服務器,如果DNS的解析出現了問題,
就可能找不到網絡中的計算機,這是就會出現網絡連接超時。
國內公共DNS:有聯通的,電信的,阿里巴巴的,騰訊的,還有114的,其實安全性最高的就是114的,防釣魚的,等等,有時我們在網絡共享中心的本地連接里配置的DNS的時候,如果那個DNS選的不好,也有可能訪問不到服務器(360DNS優選可以找到訪問不到的原因)。
(2)網絡阻塞問題(帶寬有限,但同時的請求數量比較多)
如果很多人都在訪問同一台服務器,但是網絡帶寬是一定的,比如100M帶寬,大家都想擠進去,每秒只能就100M數據,后面發送的請求數據,就會阻塞在這里,也有可能訪問不到這個服務器,即網絡阻塞。
帶寬:比如有一個數據流的管道,嚴格來講,帶寬就是在每秒能夠承受的這個數據流的大小是多少,也就是同樣的數據,細的管道每秒能傳10個字節,粗的管道每秒能傳100個字節,那粗的管道的帶寬就是100個字節,細的帶寬就是10個字節。能夠同時傳遞數據的數量越多,那這個帶寬就越大。
(3)服務器線程有限(例如tomcat端線程數量配置的相對較少)
無論是Tomcat服務器,還是JIT服務器,服務器能夠提供的線程數是有限的,比如Tomcat最多支持100個線程,也就是100個並發,那這100個並發都被占用以后,后面的請求就無法訪問了,就需要等待。
2.依賴沖突問題:
下面錯誤是maven.aliyun.com的有些資源沒有下載下來。
(1)報錯現象1:
(2)報錯現象2:
本地庫沒有換新的,經常會出現此類maven依賴沖突問題。
出現此問題的原因有如下幾個:
(1)maven的本地庫,原先有一些資源,如果在配置maven本地庫時,還是配置之前的本地庫,那這個時候,之前本地庫里面的一些資源和SpringBoot這個版本所需要的一些資源沖突了,從而導致新資源無法下載下來。
所以我們本地庫配置時,我們需要保證它是一個全新的本地庫,或者原先的本地庫里沒有任何內容,其實出現這個現象,最多的情況,即早期沒有SpringBoot時, 會經常出現這個現象,因為我們要自己去選擇添加的依賴,
自己選擇依賴時,比如MySQL選擇什么版本,連接池選擇什么版本,MyBatis選擇什么版本,SpringBoot選擇什么版本,可能有些版本我們選的不是特別好,兼容性不好,就會出現這種現象。
(2)但如果在配置SpringBoot時,已經是一個全新的本地庫,還是出現了這種問題,那么就選擇MavenUpdateProject,強制更新項目,如下圖所示:
2.安裝jdk與環境配置問題:
對於jdk1.8.0_191的安裝與之前版本的jdk有些不同,自從Sun公司被Oracle收購以后,感覺jdk變得越來越不友好了,從朋友那里要來了一個下載好的jdk1.8.0_191壓縮包,解壓后目錄如下:
我本來以為是綠色版,直接解壓后即可使用,但配置了環境變量無效,然后發現,這個壓縮包中只有jdk,卻沒有jre,這個jre.exe是需要安裝的,於是我安裝了jre,可能因為我手速太快,錯過了自定義目錄那一步操作,就安裝到了默認目錄,C:\Program Files\Java\jre1.8.0_191,這個目錄中了,此時沒有手動配置任何環境變量,但是cmd控制台輸入命令:java -version,發現命令執行成功,但在以往的jdk版本,是必須配置環境變量以后,才能在Windows命令行窗口成功執行java命令,但這里明明沒有配置環境變量,即可以成功執行,說明jre在安裝之時已經默認內置了環境變量,無需自行配置,但安裝了jre還不夠,打開了STS開發工具,就會報如下錯誤:
很明顯,是因為sts找不到jdk,實際這時我的jdk安裝到了D盤,於是我重新配置了環境變量指向D盤的jdk,但依然報此錯誤,證明自行配置的環境變量無效, 系統會以jre在安裝時內置的環境變量配置為指引,然后我把這個之前解壓好的jdk1.8.0_191,直接粘貼到了安裝jre時系統默認的指定路徑里,如下圖所示:
打開sts工具,不再報錯。
另外對於STS工具,如果直接把太可執行文件拖拽到桌面,可能會報如下錯誤:
此時只需要重新在STS的安裝目錄中,找到可執行文件,以發送快捷方式的操作發送到桌面快捷方式即可解決。
參考文章:
JDK1.8下載與安裝:https://www.jianshu.com/p/00551ce7ec60