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

SpringBoot?的?web?類型推斷詳解

 更新時間:2022年12月27日 08:39:07   作者:子悠  
這篇文章主要介紹了SpringBoot?的?web?類型推斷詳解的相關資料,需要的朋友可以參考下

用了這么多年的 SpringBoot 那么你知道什么是 SpringBootweb 類型推斷嗎?

估計很多小伙伴都不知道,畢竟平時開發(fā)做項目的時候做的都是普通的 web 項目并不需要什么特別的了解,不過抱著學習的心態(tài),阿粉今天帶大家看一下什么是 SpringBootweb 類型推斷。

SpringBoot 的 web 類型有哪些

既然是web 類型推斷,那我們肯定要知道 SpringBoot 支持哪些類型,然后才能分析是怎樣進行類型推斷的。

根據(jù)官方的介紹 SpringBootweb 類型有三種,分別是,NONESERVLETREACTIVE,定義在枚舉 WebApplicationType 中,這三種類型分別代表了三種含義:

NONE:不是一個 web 應用,不需要啟動內(nèi)置的 web 服務器; SERVLET:基于 servletweb 應用,需要啟動一個內(nèi)置的 servlet 服務器; REACTIVE:一個 reactiveweb 應用,需要啟動一個內(nèi)置的 reactive 服務器;

public enum WebApplicationType {
	NONE,
	SERVLET,
	REACTIVE;
}

web 類型推斷

上面提到了 SpringBoot 的三種 web 類型,接下來我們先通過代碼驗證一下,然后再分析一下 SpringBoot 是如何進行類型推斷的。

首先我們通過在 https://start.spring.io/ 快速的構建三種類型的項目,三種類型的項目配置除了依賴不一樣之外,其他都一樣,如下所示

None web

下載后的項目文件 pom 中對應的依賴為

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

Servlet web

下載后的項目文件 pom 中對應的依賴為

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

Reactive web

下載后的項目文件 pom 中對應的依賴為

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

接下來我們依次啟動三個項目看看有什么區(qū)別,

啟動 None web

通過啟動日志我們可以看到,在 None web 類型下,應用啟動運行后就自動關閉了,并沒有啟動內(nèi)置的 web 服務器,也沒有監(jiān)聽任何端口。接下來我們看看其他兩種類型 web 的啟動日志都是怎么樣的。

啟動 Servlet web

通過啟動日志我們可以看到這里啟動了內(nèi)置的 Tomcat Servlet 服務器,監(jiān)聽了 8080 端口,應用程序并不會像 None 類型一樣,啟動后就自動關閉。

啟動 Reactive web

通過啟動日志我們可以看到,這里啟動了內(nèi)置的 Netty 服務器,并監(jiān)聽在 8080 端口上(如果啟動失敗記得把上面 servlet web 關閉,不然端口會沖突)。

三種類型的服務我們都成功啟動了,那么接下來的問題就是 SpringBoot 是如何判斷出該使用哪種類型的呢?

這三個服務我們只有依賴不一樣,很明顯肯定和依賴有關系,接下來我們就來研究一下 SpringBoot 是如何實現(xiàn)的。

SpringBoot Web 類型推斷原理

我們在 main 方法中點擊 run 方法,

public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args) {
		return new SpringApplication(primarySources).run(args);
}

在構造函數(shù)中我們可以看到其中有這么一行 this.webApplicationType = WebApplicationType.deduceFromClasspath();根據(jù)屬性名稱我們可以推斷,web 類型就是根據(jù) WebApplicationType.deduceFromClasspath(); 這個靜態(tài)方法來判斷的。接下來我們看下這個方法的細節(jié)。

如上圖所示,可以看到 SpringBoot 底層是通過 ClassUtils.isPresent() 方法來判斷對應的 web 類型類是否存在來判斷 web 類型的。

在前類路徑下面如果當 org.springframework.web.reactive.DispatcherHandler 存在而且 org.springframework.web.servlet.DispatcherServletorg.glassfish.jersey.servlet.ServletContainer 都不存在的時候說明當前應用 web 類型為 Reactive。

javax.servlet.Servletorg.springframework.web.context.ConfigurableWebApplicationContext 任何一個不存在的時候,就說明當前應用是 None 類型非 web 應用。否則當前應用就為 Servlet 類型。

而我們再看這個 ClassUtils.isPresent() 方法,可以發(fā)現(xiàn)底層是通過 className 在類路徑上加載對應的類,如果存在則返回 true,如果不存在則返回 false。


因此這也解釋了為什么我們在 pom 文件中只要加入對應的依賴就可以直接得到相應的 web 類型了,因為當我們在 pom 中加入相應的依賴過后,類路徑里面就存在了前面判斷的對應的類,再通過 ClassUtils.isPresent() 就判斷出來當前應用屬于那種 web 類型了。

內(nèi)置服務器是如何創(chuàng)建的

知道了 SpringBoot 是如何進行 web 類型推斷的,那么接下來一個問題就是 SpringBoot 是如何根據(jù) web 類型進行相應內(nèi)置 web 服務器的啟動的呢?這里我們以 Reactive web 為例進行調(diào)試追蹤。

首先我們在 SpringApplicationrun 方法 createApplicationContext() 下一行打斷點,可以發(fā)現(xiàn)創(chuàng)建成功的 context 類型為 AnnotationConfigReactiveWebServerApplicationContext 很明顯在這一步的時候就已經(jīng)根據(jù)類型推斷得到了當前的應用 web 類型為 Reactive,并且根據(jù) web 類型創(chuàng)建出了對應的 ApplicationContext。

緊接著我們進入 org.springframework.boot.SpringApplication#refreshContext 方法,最后我們可以進入到 org.springframework.boot.web.reactive.context.ReactiveWebServerApplicationContext#refresh 方法中,因為 AnnotationConfigReactiveWebServerApplicationContext 繼承了 ReactiveWebServerApplicationContext。

繼續(xù)通過引用關系,我們可以找到 org.springframework.boot.web.reactive.context.ReactiveWebServerApplicationContext#onRefresh 方法,而在這個方法里面我們就會發(fā)現(xiàn)了如下代碼,此處就會創(chuàng)建一個 webServer。

具體創(chuàng)建的方法在 WebServerManager 里面,跟著繼續(xù)往下找我們可以找到 createHttpServer() 方法,在 createHttpServer() 方法中就創(chuàng)建了 HttpServer 并且綁定了默認的端口 8080。具體過程,如下幾張接入所示,感興趣的可以自行跟蹤 debug,至此一個 Reactive 內(nèi)置服務器就創(chuàng)建成功了,同樣的 Servlet 服務器也是類似的。




總結

Spring 的出現(xiàn)給 Java 程序員帶來了春天,而 SpringBoot 框架的出現(xiàn)又極大的加速了程序員的開發(fā)效率,然而很多時候我們在使用她的便利的同時會缺少對于底層系統(tǒng)實現(xiàn)的把握,希望這篇文章弄幫助大家對 SpringBoot 產(chǎn)生更多的理解。

到此這篇關于SpringBoot 的 web 類型推斷詳解的文章就介紹到這了,更多相關SpringBoot 的 web 類型推斷內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java快速生成PDF文檔的實例代碼

    Java快速生成PDF文檔的實例代碼

    在如今數(shù)字化時代,越來越多的人使用PDF文檔進行信息傳遞和共享,而使用Java生成PDF文檔也成為了一個非常重要的技能,所以本文我們將為您介紹如何使用Java快速生成PDF文檔,需要的朋友可以參考下
    2023-09-09
  • SpringBoot中REST API 接口傳參的實現(xiàn)

    SpringBoot中REST API 接口傳參的實現(xiàn)

    我們在開發(fā)?REST API?的過程中,經(jīng)常需要傳遞參數(shù),本文主要介紹了SpringBoot中REST API 接口傳參的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2023-12-12
  • SpringBoot2.0集成Swagger2訪問404的解決操作

    SpringBoot2.0集成Swagger2訪問404的解決操作

    這篇文章主要介紹了SpringBoot2.0集成Swagger2訪問404的解決操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • Java全面細致講解==和equals的使用

    Java全面細致講解==和equals的使用

    這篇文章主要介紹了Java中==和equals()的區(qū)別,,==可以使用在基本數(shù)據(jù)類型變量和引用數(shù)據(jù)類型變量中,equals()是方法,只能用于引用數(shù)據(jù)類型,需要的朋友可以參考下
    2022-05-05
  • java開發(fā)中嵌套類的詳解及實例

    java開發(fā)中嵌套類的詳解及實例

    這篇文章主要介紹了 java開發(fā)中嵌套類的詳解及實例的相關資料,一般把定義內(nèi)部類的外圍類成為包裝類(enclosing class)或者外部類,需要的朋友可以參考下
    2017-07-07
  • javac final變量未賦值檢測案例講解

    javac final變量未賦值檢測案例講解

    這篇文章主要介紹了javac final變量未賦值檢測案例講解,通過本文,我們可以知道Eclipse中報如下錯誤:The blank final field b may not have been
    initialized. 是在Flow階段由AssignAnalyzer檢測出來的,需要的朋友可以參考下
    2022-12-12
  • java網(wǎng)上圖書商城(9)支付模塊

    java網(wǎng)上圖書商城(9)支付模塊

    這篇文章主要為大家詳細介紹了java網(wǎng)上圖書商城,支付模塊,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • Java中BigDecimal精度和相等比較的坑

    Java中BigDecimal精度和相等比較的坑

    BigDecimal是一種精確的數(shù)字類,一般用于高精度的開發(fā)領域中,例如銀行。下面這篇文章主要給大家介紹了關于Java中BigDecimal精度和相等比較的坑的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2018-09-09
  • Java添加Word文本水印和圖片水印

    Java添加Word文本水印和圖片水印

    這篇文章主要介紹了Java添加Word文本水印和圖片水印,文章圖文講解的很清晰,有對于這方面不懂得同學可以學習下
    2021-02-02
  • 在Java中使用redisTemplate操作緩存的方法示例

    在Java中使用redisTemplate操作緩存的方法示例

    這篇文章主要介紹了在Java中使用redisTemplate操作緩存的方法示例,在Redis中可以存儲String、List、Set、Hash、Zset。感興趣的可以了解一下
    2019-01-01

最新評論

保德县| 子长县| 北安市| 韩城市| 女性| 霸州市| 巍山| 霸州市| 九龙县| 望城县| 金门县| 千阳县| 基隆市| 义马市| 绥江县| 信丰县| 泾川县| 乌兰察布市| 南雄市| 安溪县| 罗田县| 桑日县| 梨树县| 海口市| 大竹县| 新民市| 嘉义县| 玉田县| 云南省| 陕西省| 民丰县| 尼玛县| 南岸区| 兴仁县| 许昌市| 满洲里市| 湖口县| 连城县| 高阳县| 白朗县| 石台县|