亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

前言

我們從以下幾個(gè)方面研究:

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

pom.xml文件分析

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

項(xiàng)目中的pom.xml中繼承了一個(gè)坐標(biāo)

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

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

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

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

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

可以看到子工程當(dāng)中我們沒(méi)有聲明版本號(hào),是因?yàn)樗械陌姹径加筛割悰Q定,這樣做的好處是什么:解決了版本沖突。不同模塊、不同功能之間使用的版本是不一樣的,因此spring boot就為我們將所有的版本統(tǒng)一化了。

啟動(dòng)器starter

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

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

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

項(xiàng)目中的pom.xml定義了使用springMVC技術(shù),但是并沒(méi)有寫SpringMVC的坐標(biāo),而是添加了一個(gè)名字中包含starter的依賴

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

在spring-boot-starter-web中又定義了若干個(gè)具體依賴的坐標(biāo)

<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ù)打開(kāi)任意一個(gè)依賴,發(fā)現(xiàn)里面又會(huì)包含一些依賴。

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

總結(jié):

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

啟動(dòng)引導(dǎo)類

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

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

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

@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,說(shuō)明他就是一個(gè)容器,拿到容器之后再通過(guò)getBean()來(lái)拿到bean,打印在控制臺(tái)。

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

@SpringBootApplication注解

接下來(lái)我們看一下@SpringBootApplication注解

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

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

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

我們?cè)趧?chuàng)建spring boot項(xiàng)目時(shí),會(huì)勾選需要的依賴,然后導(dǎo)入對(duì)應(yīng)的starter

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

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

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

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

說(shuō)到定義的位置,我們可以通過(guò)兩種方式來(lái)查看:

第一種

第二種

tomcat運(yùn)行原理

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

當(dāng)然可以,這里spring boot將tomcat以jar包的形式放到spring容器中讓他變成一種對(duì)象,然后運(yùn)行這個(gè)對(duì)象,把我們的項(xiàng)目啟動(dòng)起來(lái),這就是它能夠啟動(dòng)并且運(yùn)行的原理。

修改服務(wù)器

如果我們不想用他提供的版本能不能修改呢?可以,我們可以通過(guò)<exclusions>標(biāo)簽來(lái)排除提供的版本,或者內(nèi)置服務(wù)器,然后在再重新添加依賴來(lái)達(dá)到修改服務(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>

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

添加服務(wù)器

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

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

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

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

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

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

想用哪個(gè),加個(gè)坐標(biāo)就OK。前提是把tomcat排除掉,因?yàn)閠omcat是默認(rèn)加載的。

<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ù)器,它的核心思想就是加入對(duì)應(yīng)的坐標(biāo)就可以了。

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

相關(guān)文章

  • Mybatis 中 Oracle 的拼接模糊查詢及用法詳解

    Mybatis 中 Oracle 的拼接模糊查詢及用法詳解

    這篇文章主要介紹了Mybatis 中 Oracle 的拼接模糊查詢及用法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-08-08
  • Springboot整合策略模式詳解

    Springboot整合策略模式詳解

    這篇文章主要介紹了Springboot整合策略模式詳解的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • springMarchal集成xStream的完整示例代碼

    springMarchal集成xStream的完整示例代碼

    這篇文章主要介紹了springMarchal集成xStream的示例代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03
  • Spring的DI依賴注入詳解

    Spring的DI依賴注入詳解

    這篇文章主要為大家介紹了Spring的DI依賴注入,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-01-01
  • Java使用for循環(huán)解決經(jīng)典的雞兔同籠問(wèn)題示例

    Java使用for循環(huán)解決經(jīng)典的雞兔同籠問(wèn)題示例

    這篇文章主要介紹了Java使用for循環(huán)解決經(jīng)典的雞兔同籠問(wèn)題,結(jié)合實(shí)例形式分析了Java巧妙使用流程控制語(yǔ)句for循環(huán)解決雞兔同籠問(wèn)題相關(guān)操作技巧,需要的朋友可以參考下
    2018-05-05
  • Java中使用Closeable接口自動(dòng)關(guān)閉資源詳解

    Java中使用Closeable接口自動(dòng)關(guān)閉資源詳解

    這篇文章主要介紹了Java中使用Closeable接口自動(dòng)關(guān)閉資源詳解,Closeable接口繼承于AutoCloseable,主要的作用就是自動(dòng)的關(guān)閉資源,其中close()方法是關(guān)閉流并且釋放與其相關(guān)的任何方法,如果流已被關(guān)閉,那么調(diào)用此方法沒(méi)有效果,需要的朋友可以參考下
    2023-12-12
  • Mybatis-plus4條件構(gòu)造器使用方式

    Mybatis-plus4條件構(gòu)造器使用方式

    這篇文章主要介紹了Mybatis-plus4條件構(gòu)造器使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • 一文了解mybatis的延遲加載

    一文了解mybatis的延遲加載

    本文主要為大家詳細(xì)介紹下mybatis的延遲加載,從原理上介紹下怎么使用、有什么好處能規(guī)避什么問(wèn)題。感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-07-07
  • 輕松掌握java裝飾者模式

    輕松掌握java裝飾者模式

    這篇文章主要幫助大家輕松掌握java裝飾者模式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • Java IO中字節(jié)流復(fù)制圖片實(shí)現(xiàn)代碼

    Java IO中字節(jié)流復(fù)制圖片實(shí)現(xiàn)代碼

    這篇文章主要介紹了Java IO中字節(jié)流復(fù)制圖片實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下
    2017-04-04

最新評(píng)論