品Spring:SpringBoot和Spring到底有沒有本質的不同?

来源:https://www.cnblogs.com/lixinjie/archive/2019/09/27/taste-spring-006.html
-Advertisement-
Play Games

現在的Spring相關開發都是基於SpringBoot的。最後在打包時可以把所有依賴的jar包都打進去,構成一個獨立的可執行的jar包。如下圖13: 使用java -jar命令就可以運行這個獨立的jar包。如下圖14: 這個jar包的執行入口就是一個main函數,典型的格式如下: 從代碼中可以得知, ...


現在的Spring相關開發都是基於SpringBoot的。

最後在打包時可以把所有依賴的jar包都打進去,構成一個獨立的可執行的jar包。如下圖13:


使用java -jar命令就可以運行這個獨立的jar包。如下圖14:


這個jar包的執行入口就是一個main函數,典型的格式如下:

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


從代碼中可以得知,SpringApplication這個類就是SpringBoot的總入口。

以上這些內容,早已是路人皆知的事情了,這裡只是再贅述一遍


進入SpringApplication這個類的源碼里,首先看到的就是幾個application context所使用的類。

首先是AnnotationConfigApplicationContext,這是基於註解的非web應用使用的類,它是spring-context裡面的類,現在也用於SpringBoot中。

這表明對於非web應用來說,採用傳統的Spring構建,或是採用現在的SpringBoot構建,核心部分並沒有什麼本質區別。畢竟連類都是用的同一個。


再看就是AnnotationConfigServletWebServerApplicationContext,這是基於註解的web應用使用的類,註意,這個類是SpringBoot里的類

其實大家都知道,在還沒有SpringBoot時,基於傳統Spring構建web應用時使用的是AnnotationConfigWebApplicationContext這個類。

這個類位於spring-web中,顯然它是Spring裡面的類。(註:本文中所說的Spring指的是SpringFramework)

這裡有一個問題,不知你是否發現,從Spring到SpringBoot,非web應用使用的類沒有變,web應用使用的類改變了,為啥呢?


這個問題其實很簡單,從它們的啟動方式的差異就能很好的說明。

傳統Spring構建的web應用,會打成一個war包,放入tomcat下麵。

先啟動tomcat,然後tomcat再去載入它下麵的web應用(即war包)。

SpringBoot構建的web應用,會打成一個jar包,採用內嵌的tomcat。

先啟動jar包,會進入SpringBoot中,然後再去啟動tomcat。

因為現在SpringBoot要來負責啟動和停止web server,這和傳統Spring完全不同,所以它要自己實現一個web application context所使用的類。

由此我們可以推斷出,這個類里一定有關於web server啟動和停止的相關內容。


再來觀察一個細節,沒錯,就是類名稱。

傳統Spring使用的類名稱可以提煉出一個關鍵詞,就是Web。SpringBoot使用的類名稱可以提煉出的關鍵詞是ServletWebServer

前者只有Web,說明只關註web的問題,後者除了Web外還有Server,說明除了關註web外還要關註伺服器,即tomcat、jetty等這些web伺服器。

由此可見,從類名稱上的解釋和剛剛從啟動方式上的解釋是吻合的,是一致的。

這也說明,“時刻關註細節,你將發現更多”。這句話不僅可以用在工作當中,亦可以用在學習中、生活中。


細心的同學又會發現,後者中還有一個Servlet呢,這又怎麼解釋呢?

這說明這個WebServer是基於Servlet實現的。難道還有不是基於Servlet的嗎?有啊,那就是基於Reactive(響應式或反應式)的。

響應式使用的類是這個AnnotationConfigReactiveWebServerApplicationContext。可以仔細對比一下名字。

Spring從5.x引入了響應式編程。這裡不做深入討論,需要的話可以去看“編程新說”這個號之前的文章。


接著我們去源碼里看看,來證實一下我們的猜想。進入ServletWebServerApplicationContext類,就是剛剛那個類的父類。

首先它定義了一個WebServer,如下圖01:


其次又創建了這個WebServer,如下圖02:


接著又啟動了這個WebServer,如下圖03:


最後又關閉和釋放了這個WebServer,如下圖04:


由此證明瞭我們的猜想,確實有關於web伺服器的“全套”操作。

現在SpringBoot翻身成了主人,它不僅可以啟停web伺服器,還可以選擇web伺服器,是用tomcat、jetty還是netty,都是可以配置的。爽吧。


Spring的核心就是IOC容器,容器所作的事情就是bean定義的註冊,bean的實例化、初始化、依賴的裝配,bean方法的調用,bean實例的銷毀。

我們先來看看bean定義的註冊吧。

首先看下傳統Spring的,也就是AnnotationConfigWebApplicationContext這個類的。

先定義兩個成員變數,存儲要註冊的類和要掃描的包,如下圖05:


然後又用兩個類AnnotatedBeanDefinitionReader和ClassPathBeanDefinitionScanner來負責註冊類和掃描包,如下圖0607:


最後就是具體的來執行註冊類和掃描包,如下圖08:



接著再看下SpringBoot的,也就是AnnotationConfigServletWebServerApplicationContext這個類的。

也是先定義兩個成員變數,和上面的如出一轍,如下圖09:


也是用相同的兩個類來負責處理,如下圖1011:


編程新說註
實例化時雖然調用的構造函數不同,但是最終執行的卻是相同的構造函數。

最終執行具體的處理也是相同的,如下圖12:


由此可以看出傳統Spring和SpringBoot在對待bean定義註冊這一塊,完全相同,沒有任何區別。

其實這很好理解,IOC容器這塊內容在Spring中已經發展的相當成熟了,是不會再有人輕易去修改它了。

因此SpringBoot和Spring在本質上沒什麼差別,註意這裡說的是本質。

由於SpringBoot的啟動方式是把自身提前把web伺服器移後(即採用內嵌web伺服器),所以這塊是額外新增的內容。

由於SpringBoot採用根據條件(condition)自動配置的方式(AutoConfiguration),所以這塊也是額外新增的內容。

這兩塊都是額外新增的內容,和傳統Spring基本沒啥關係。

因此在SpringBoot和Spring重疊的部分,其實本質沒啥區別。

 

(END)

 

>>> 品Spring系列文章 <<<

 

品Spring:帝國的基石

品Spring:bean定義上梁山

品Spring:實現bean定義時採用的“先進生產力”

品Spring:註解終於“成功上位”

品Spring:能工巧匠們對註解的“加持”

 

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、協程 1.歷史進程: (1)3.4引入協程,用yield來實現 (2)3.5引入協程語法 (3)實現協程比較好的包有asyncio,tornado,gevent 2.定義:協程是為非搶占式多任務產生子程式的電腦程式組件,協程允許不同入口點在不同位置暫停或開始執行程式 3.從技術角度講,協程就是 ...
  • python面向函數式編程,模擬用戶登錄驗證、註冊的代碼實現。 主要有以下兩個文件: 1、user.txt文檔文件,相當於資料庫的用戶信息表,主要是記錄用戶名和密碼。 註意:1)此文檔需要與.py文件放在同一個路徑下。 2)用戶名、密碼在存儲時,是以$符號區別開。 2、模擬用戶登錄驗證、註冊的代碼實 ...
  • @[TOC]     下麵向大家介紹一下我在學習python課程的一些題目的解法,如果大家有什麼更好的解法請私信我。這裡只顯示題目與代碼。 1.快樂的數字     描述: 編寫一個演算法來確定一個數字是否“快樂”。 快樂的數字按照如下方式確定 ...
  • Spring框架主要包括IoC和AOP,這兩大功能都可以使用註解進行配置。 一、bean定義 二、依賴註入 三、使用Primary註解 四、Scope註解 五、方法註入 六、AOP註解 七、ComponentScan註解 ...
  • 在有道翻譯頁面中打開開發者工具,在Headers板塊找到Request URL以及相應的data。 上面這種很大可能被有道網頁給識別出來不是人工在訪問,而是代碼在訪問。 此時我們可以加個‘User-Agent’代理。通過設置User Agent來達到隱藏身份的目的,一般情況下瀏覽器是通過User-A ...
  • 目錄 "Java中的構造方法" "構造方法簡介" "構造方法實例" "例 1" "例 2" "Java中的幾種構造方法詳解" "普通構造方法" "預設構造方法" "重載構造方法" "java子類構造方法調用父類構造方法" "Java中的代碼塊簡介" "Java代碼塊使用" "局部代碼塊" "構造代碼 ...
  • 目錄 "抽象類介紹" "為什麼要用抽象類" "一個抽象類小故事" "一個抽象類小游戲" "介面介紹" "介面與類相似點:" "介面與類的區別:" "介面特性" "抽象類和介面的區別" "介面的使用:" "介面最佳實踐:設計模式中的工廠模式" "介面與抽象類的本質區別是什麼?" "基本語法區別" "設 ...
  • [TOC] OS模塊 能與操作系統交互,控制文件 / 文件夾 | 方法 | 詳解 | | : : | : : | | os.getcwd() | 獲取當前工作目錄,即當前python腳本工作的目錄路徑 | | os.chdir("dirname") | 改變當前腳本工作目錄;相當於shell下cd ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...