SpringBoot-HelloWorld的pom文件配置

前言

關於如何搭建Springboot hellowolrd應用其實很簡單,網上也有非常多的教程,我之前也寫過一個最簡單的springboot hello world應用,可以看看Springboot hello world搭建

其實在搭建springboot應用中,可能會明顯感覺到其中省去了很多之前慣用的Spring+SpringMVC+Mybatis中的一些配置,在之前,我們需要在SpringMVC中開啓掃描和註解,Spring配置文件中同樣要配置掃描以及數據源等諸多配置,當這些工作準備好了之後才能開始正兒八經地寫業務代碼。Springboot雖然省去了諸多的配置步驟,但大家需要清楚的是這些配置和整合實際上並沒有減少,而是在SpringBoot較少的配置中包含進去了,本文我想針對Hello Wolrd的應用進行展開說明。

配置說明

1、jar包的解壓內容分析

首先我想說的是,在hello world的應用中我有提到可以將該工程打成jar包,執行java -jar xxx包的形式將應用啓動起來,但實際上有心的同學肯定願意做這樣的嘗試,使用解壓工具將打出的jar包進行解壓,觀察一下它裏面的目錄內容,我們可以進入到/BOOT-INF/lib的目錄下,我們發現這裏麪包含了很多jar包:

我們發現其中有內嵌的tomcat、springmvc、日誌log4j等等jar包,這就是爲什麼,我們直接運行java -jar xxx後,在瀏覽器同樣能出現hello world的輸出。但實際上這些配置,我們在構建hello world的時候並沒有手動去做。這是爲什麼呢?讓我們回到pom.xml這個配置文件。

2、pom文件配置分析

打開pom.xml文件,其中有這麼這幾個配置:

1、父項目parent

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.4.RELEASE</version>
</parent>

官方文檔或一些技術文章可能會有說明,如果你不想使用該父項目時,可以自己進行選擇,既然叫父項目,那麼就說明這個配置應該是繼承或者沿用的某個配置依賴,我們可以ctrl+鼠標左鍵點擊spring-boot-starter-parent,進入了spring-boot-starter-parent-...pom.xml,發現它的父項目還有一層parent,

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>2.3.4.RELEASE</version>
</parent>

它的父項目爲spring-boot-dependencies,我們再次追進去,進入到了spring-boot-dependencies-xxx.pom文件,在該文件我們會發現該文件中的<properties>標籤中包含很多依賴以及該依賴的版本信息。至此追到底了,這時我們就要明白,我們手動配置這幾行的parent配置,實際上底層Springboot爲我們自動配置很多的依賴,所以說spring-boot-dependencies纔是真正管理springboot應用裏面的所有依賴版本。dependencies裏面的這些配置都爲我們省去了。

注意:雖然這種配置使得我們導入的依賴默認不需要寫版本號,如果你需要使用到dependencies中管理之外的依賴,你還是需要額外地聲明該依賴的版本號

2、spring-boot-starter-web配置

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
</dependency>

我們發現還有一個名爲spring-boot-starter-web配置,同樣追加springboot-starter-web,它的dependdencies下也包含了諸多依賴配置,諸如spring-boot-starter/tomcat/springmvc等依賴,這些發現這些依賴都和和視圖場景相關,實際上org.springframework.boot是springboot的場景啓動器,它幫我們導入了web模塊正常啓動依賴的組件。我們可以查看官方文檔,搜索starters 發現它包含了諸多獨立功能的組件配置,並且貼心地提供了每個功能在pom中配置,也就是說,springboot 將所有的功能場景都抽取出來,做成一個個的starters(啓動器),只需要在項目裏引入這些starter相關場景的所有依賴都會導入進來,要用什麼場景就導入什麼場景的啓動器。

3、Hello world主程序分析

主程序類:Application類,其中有一個@SpringbootApplication註解,springboot應用標註在某個類上說明這個類是springboot的主程序類,springBoot就應該運行這個類main方法來啓動springboot應用,實際上當我們追加到這個註解中發現,這個註解是諸多註解的一個組合形態:

 

@springbootConfigration:Springboot的配置註解

@springbootConfigration註解標註在一個類上,表示這是一個Springboot的配置類,我們使用ctrl+鼠標左鍵追加進去,發現它的原始註解是@Configuration註解,這個註解對於之前玩Spring+SpringMVC的同學來說應該非常熟悉吧,之前spring配置中,我們一般用@Configration註解來替代配置文件,配置類也是容器中的一個組件@component。

2.@EnableAutoCongfigration

字面意思,開啓自動配置功能,以前我們需要配置的東西,Springboot幫我們自動配置,@EnableAutoConfiguration-->@AutoConfigrationPackage--->@Import({Register.class}),這樣明瞭了,實際上它的底層還是spring的底層註解@Import,給容器中導入一個組件(組件名由AutoConfigurationImportSelector來指定),導入的組件由AutoConfigrationPackages.Registra.class指定。Register的類指定需要導入的package包,再次追加到Register類中,發現有這麼一個方法:

public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
    AutoConfigurationPackages.register(registry, (String[])(new AutoConfigurationPackages.PackageImports(metadata)).getPackageNames().toArray(new String[0]));
}
AutoConfigurationPackages.register(registry, (String[])(new AutoConfigurationPackages.PackageImports(metadata)).getPackageNames().toArray(new String[0]));

正是在做導入包的工作,metadata是所需依賴的元數據。

我們還可以做以下動作來證實以上描述,在這行代碼打上斷點,debug啓動,我們選中new AutoConfigurationPackages.PackageImports(metadata).getPackageNames().toArray(new String[0])右鍵選擇Evaluate Expression計算這個代碼的值

 我們result結果中發現值爲"com",而com正是我們創建Application主程序類所在的包名,其次,在debug的信息欄中我們可以metadata元數據introspectedClass指向的也正是我們的主程序類Application

 

所以,我們可以說,metadata表示的是註解的元信息,它標註的是SpringBootApplication裏面的東西,它是標註在com.Application類上,這就是我們的啓動類,通過getPackageNames()方法獲取到主配置類Application所在的包下面所有組件依賴都掃描進去。

如果有同學不信的話,可以做以下實驗,當你將Controller類移到com包之外,然後啓動程序,我們發現啓動會有錯誤信息打印。所以,@AutoConfigurationPackage註解就是講主配置類所在包下的所有組件全部掃描到spring容器中。

3、spring-boot-maven-plugin配置

這個配置就簡單了,如果你想講應用打成對應的jar包,那麼你需要加入該配置。

總結

以上就是我針對自己搭建的hello world應用配置文件的說明,難免有說的不對地方,請大家指正。

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