最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot深入分析運行原理與功能實現(xiàn)

 更新時間:2022年09月09日 09:39:02   作者:Binaire-沐辰  
我們發(fā)現(xiàn)springBoot程序開發(fā)比spring程序編寫起來容易的多。配置簡潔,依賴關(guān)系簡單,啟動運行容易。那么結(jié)下了我們我們就要思考一下入門程序中的這些功能是怎么實現(xiàn)的

前言

我們從以下幾個方面研究:

  • SpringBoot的啟動依賴
  • 啟動器starter有什么作用
  • 啟動引導(dǎo)類是怎么運行的
  • 內(nèi)置的tomcat服務(wù)器原理

pom.xml文件分析

我們應(yīng)用配置第一個就是依賴,這個依賴的作用到底是什么我們仔細來分析一下。

項目中的pom.xml中繼承了一個坐標

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.7.3</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

注意:這里parent的坐標被工程繼承了,相當于這是一個父類,我們創(chuàng)建的工程是一個子類,用到了父類的東西。

打開spring-boot-starter-parent之后,發(fā)現(xiàn)他又繼承了一個坐標。

繼續(xù)打開spring-boot-dependencies之后,發(fā)現(xiàn)該文件中主要定義了兩組信息,分別是各種依賴的版本號和所有依賴的坐標信息,并對聲明的版本號做了一個引用。我們打開發(fā)現(xiàn)這里有兩千多行,所有能配置的版本基本都包含了。

由于Spring Boot工程使用到了maven的聚合工程,所以這里我們可以認為spring-boot-dependencies就是父工程,子工程就是我們自己的項目。當我們子工程中使用<parent>繼承父類之后,所有的版本就都由父類決定了。

可以看到子工程當中我們沒有聲明版本號,是因為所有的版本都由父類決定,這樣做的好處是什么:解決了版本沖突。不同模塊、不同功能之間使用的版本是不一樣的,因此spring boot就為我們將所有的版本統(tǒng)一化了。

啟動器starter

SpringBoot官方給出了好多個starter的定義,方便我們使用,而且名稱都是如下格式

命名規(guī)則: spring-boot-starter-技術(shù)名稱

starter定義了使用某種技術(shù)時對于依賴的固定搭配格式,也是一種最佳解決方案,使用starter可以幫助開發(fā)者減少依賴配置

項目中的pom.xml定義了使用springMVC技術(shù),但是并沒有寫SpringMVC的坐標,而是添加了一個名字中包含starter的依賴

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

在spring-boot-starter-web中又定義了若干個具體依賴的坐標

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <version>2.7.3</version>
    <scope>compile</scope>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-json</artifactId>
    <version>2.7.3</version>
    <scope>compile</scope>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <version>2.7.3</version>
    <scope>compile</scope>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>5.3.22</version>
    <scope>compile</scope>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.3.22</version>
    <scope>compile</scope>
  </dependency>
</dependencies>

然后你可以繼續(xù)打開任意一個依賴,發(fā)現(xiàn)里面又會包含一些依賴。

我們可以發(fā)現(xiàn),這個starter中又包含了若干個坐標,其實就是使用SpringMVC開發(fā)通常都會使用到Json,使用json又離不開這里面定義的這些坐標,看來還真是方便,SpringBoot把我們開發(fā)中使用的東西能用到的都給提前做好了。你仔細看完會發(fā)現(xiàn),里面有一些你沒用過的。的確會出現(xiàn)這種過量導(dǎo)入的可能性,沒關(guān)系,可以通過maven中的排除依賴剔除掉一部分。不過你不管它也沒事,大不了就是過量導(dǎo)入唄。

總結(jié):

使用starter可以幫開發(fā)者快速配置依賴關(guān)系。以前寫依賴3個坐標的,現(xiàn)在寫導(dǎo)入一個就搞定了,就是加速依賴配置的。

啟動引導(dǎo)類

目前程序運行的入口就是SpringBoot工程創(chuàng)建時自帶的那個類了,帶有main方法的那個類,運行這個類就可以啟動springBoot工程的運行

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

Spring Boot本身就是為了加速Spring程序而開發(fā)的,而Spring程序運行的基礎(chǔ)是需要創(chuàng)建自己的Spring容器對象,并將所有的對象管理在容器里面,這時候你可能會疑惑,Spring boot加速了Spring程序,那spring boot中有沒有容器呢,或者說這個容器還存在嗎?答案是存在,我們可以修改上面的代碼來驗證一下。

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);
        Application bean = context.getBean(Application.class);
        System.out.println(bean);
    }
}

這里的ConfigurableApplicationContext繼承了ApplicationContext,說明他就是一個容器,拿到容器之后再通過getBean()來拿到bean,打印在控制臺。

可以看到控制臺打印出來了對應(yīng)的地址,說明它就是c從容器中拿到的一個對象,說明spring boot中存在一個容器,而SpringApplication.run(Application.class, args);就是運行Spring Boot容器,

@SpringBootApplication注解

接下來我們看一下@SpringBootApplication注解

根據(jù)箭頭打開注解可以看到有Spring Boot配置以及自動配置,自動配置包等等,因此當程序加了@SpringBootApplication注解,他就會掃描這個類所在包下和子包下面的所有類。并且他還是spring boot的配置類,所以spring的一些配置文件就不用寫了,配置類自動搞定了。

總結(jié)一下:這個啟動引導(dǎo)類,創(chuàng)建了一個容器并將該容器運行起來,做了一個配置類,里面有一些自動配置的東西,然后我們創(chuàng)建的對象就可以放在引導(dǎo)類的包以及子包中,就可以掃描到了。

內(nèi)置的服務(wù)器

我們在創(chuàng)建spring boot項目時,會勾選需要的依賴,然后導(dǎo)入對應(yīng)的starter

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

內(nèi)置的tomcat服務(wù)器來研究幾個問題

  • 這個服務(wù)器在什么位置定義的
  • 這個服務(wù)器是怎么運行的
  • 這個服務(wù)器如果想換怎么換

內(nèi)嵌Tomcat定義位置

說到定義的位置,我們可以通過兩種方式來查看:

第一種

第二種

tomcat運行原理

tomcat本身就是一個Java項目,那么可不可以將tomcat中的一些東西直接放回項目中,讓他變成一個Java代碼?

當然可以,這里spring boot將tomcat以jar包的形式放到spring容器中讓他變成一種對象,然后運行這個對象,把我們的項目啟動起來,這就是它能夠啟動并且運行的原理。

修改服務(wù)器

如果我們不想用他提供的版本能不能修改呢?可以,我們可以通過<exclusions>標簽來排除提供的版本,或者內(nèi)置服務(wù)器,然后在再重新添加依賴來達到修改服務(wù)器版本或者更換服務(wù)器的目的。

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

當添加<exclusions>標簽之后,就把內(nèi)置的tomcat的服務(wù)器排除了,這時候你在啟動項目,在控制臺就不會看到tomcat相關(guān)的信息了,并且網(wǎng)頁也無法訪問了。

添加服務(wù)器

這時候你再添加你想要的使用的服務(wù)器,只需添加對應(yīng)的坐標即可

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

同樣在控制臺就會看到服務(wù)器相關(guān)的信息了,并且網(wǎng)頁也可以正常訪問了。不過這樣就顯得有點多此一舉了,好好的東西不用,非要自己搞這些,所以還是建議使用內(nèi)置的服務(wù)器。

更換內(nèi)嵌服務(wù)器

那我們是否可以換個服務(wù)器呢?必須的嘛。根據(jù)SpringBoot的工作機制,用什么技術(shù),加入什么依賴就行了。SpringBoot提供了3款內(nèi)置的服務(wù)器

  • tomcat(默認): apache出品,粉絲多,應(yīng)用面廣,負載了若干較重的組件
  • jetty:更輕量級,負載性能遠不及tomcat
  • undertow:負載性能勉強跑贏tomcatI

想用哪個,加個坐標就OK。前提是把tomcat排除掉,因為tomcat是默認加載的。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jetty</artifactId>
</dependency>

現(xiàn)在就已經(jīng)成功替換了web服務(wù)器,它的核心思想就是加入對應(yīng)的坐標就可以了。

到此這篇關(guān)于SpringBoot深入分析運行原理與功能實現(xiàn)的文章就介紹到這了,更多相關(guān)SpringBoot運行原理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java類型生命周期的詳細解析

    java類型生命周期的詳細解析

    以下是對java中的類型生命周期進行了詳細的分析介紹,需要的朋友可以過來參考下
    2013-08-08
  • Springboot Druid 自定義加密數(shù)據(jù)庫密碼的幾種方案

    Springboot Druid 自定義加密數(shù)據(jù)庫密碼的幾種方案

    這篇文章主要介紹了Springboot Druid 自定義加密數(shù)據(jù)庫密碼的步驟,幫助大家更好的理解和使用springboot,感興趣的朋友可以了解下
    2020-12-12
  • java程序中protobuf的基本用法示例

    java程序中protobuf的基本用法示例

    這篇文章主要給大家介紹了關(guān)于java程序中protobuf的基本用法,protobuf 與json相比具有 壓縮比高 、解壓縮速度更快的優(yōu)點,本文通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2021-08-08
  • 詳解java基于MyBatis使用示例

    詳解java基于MyBatis使用示例

    這篇文章主要介紹了詳解java基于MyBatis使用示例,對學(xué)習(xí)MyBatis有一定的幫助,有需要的可以了解一下。
    2016-11-11
  • 哈希表在算法題目中的實際應(yīng)用詳解(Java)

    哈希表在算法題目中的實際應(yīng)用詳解(Java)

    散列表(Hash?table,也叫哈希表)是根據(jù)關(guān)鍵碼值(Key?value)而直接進行訪問的數(shù)據(jù)結(jié)構(gòu),下面這篇文章主要給大家介紹了關(guān)于哈希表在算法題目中的實際應(yīng)用,文中介紹的方法是Java,需要的朋友可以參考下
    2024-03-03
  • java實現(xiàn)基因序列比較的示例代碼

    java實現(xiàn)基因序列比較的示例代碼

    這篇文章主要介紹了java實現(xiàn)基因序列比較的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • 關(guān)于IntelliJ IDEA 打包代碼報錯的問題

    關(guān)于IntelliJ IDEA 打包代碼報錯的問題

    這篇文章主要介紹了關(guān)于IntelliJ IDEA 打包代碼報錯的問題,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • idea 開發(fā)神器之idea插件匯總

    idea 開發(fā)神器之idea插件匯總

    這篇文章主要介紹了idea 開發(fā)神器之idea插件匯總,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • Mybatis的動態(tài)Sql組合模式詳情

    Mybatis的動態(tài)Sql組合模式詳情

    這篇文章主要介紹了Mybatis的動態(tài)Sql組合模式詳情,這篇文章從組合模式的角度分析了Mybatis動態(tài)sql的部分,SqlNode是組合模式的Component接口,更多相關(guān)內(nèi)容需要的小伙伴可以參考一下
    2022-08-08
  • 詳解SpringBean基于XML的裝配

    詳解SpringBean基于XML的裝配

    Bean的裝配可以理解為依賴關(guān)系注入,Bean的裝配方式也就是Bean 的依賴注入方式.Spring容器支持多種形式的Bean的裝配方式,如基于XML的Bean裝配,基于Annotation的Bean裝配和自動裝配等.本文就帶大家了解SpringBean基于XML的裝配,需要的朋友可以參考下
    2021-05-05

最新評論

杂多县| 辽阳市| 彩票| 凌海市| 松江区| 峡江县| 荣昌县| 神农架林区| 祁阳县| 盐边县| 罗定市| 美姑县| 博白县| 开封县| 澜沧| 永宁县| 共和县| 天等县| 清徐县| 淮安市| 江川县| 宁城县| 华安县| 祥云县| 漳州市| 西吉县| 永仁县| 西和县| 尚志市| 锡林郭勒盟| 二手房| 吉木萨尔县| 綦江县| 象州县| 永泰县| 青铜峡市| 嘉荫县| 夏邑县| 孝感市| 榆林市| 聂荣县|