国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

從SpringBoot啟動,閱讀源碼設計

開發 架構
Spring框架的強大之處還在于能夠和其他組件進行簡單快速的集成,比如常用的數據庫、緩存、消息隊列等各種類型的組件,分析內部的集成邏輯,會發現很多原理上的相似性,尤其在SpringBoot框架中,約定大于配置。

一、背景說明

初學SpringBoot框架時,第一次啟動服務,直呼什么鬼?只需要簡單的幾步配置,幾個核心的注解,就可以快速實現工程的搭建和運行;

雖然從Spring框架遷移到SpringBoot框架,在初期會有很多的不適應,但是更好用的框架會快速得到認可,從而成為主流的技術選型;

對于大多數的框架或者組件來說,如果使用起來越是簡便,那么其內部的封裝策略就越是復雜;

比如在Spring框架更新到SpringBoot版本時,其用法的簡便與內部封裝的復雜性已經形成強烈的對比;再到SpringCloud微服務框架時,其封裝邏輯復雜到離譜;

對于服務端的開發來說,繞不開對Spring框架的深度學習,如果單純站在源碼閱讀的角度,建議先熟讀SpringBoot啟動流程,然后再適當擴展其他源碼塊;

二、SpringBoot工程

首先聊一聊閱讀源碼的基本思路,從一個極簡的案例開始,圍繞案例中的核心API作為切入點,通過對源碼邏輯的斷點調試,從而體會其設計的原理;

閱讀SpringBoot的源碼,可以從服務啟動方法作為切入點,然后不斷的分析啟動過程涉及到的核心API和設計原理,再基于具體的啟動日志去分析抽象的加載邏輯;

圖片

在看具體的源碼之前,還需要說下分析思路,Spring項目中,要注意每個API所屬工程與層級,然后再去分析API之間關系,核心的構造、屬性、方法等;

在SpringBoot的啟動類中,有兩個核心的切入點,一個是類的構造方法,完成一列的初始化動作;一個是啟動方法,實現應用上下文的創建和裝載;

構造方法:

圖片

啟動方法:

圖片

需要說明的是,由于SpringBoot服務啟動過程涉及源碼過多,所以上面的源碼中只是羅列部分的核心切入點,然后圍繞這些關鍵流程展開,分析一些常見的源碼設計;

另外說明一點,以下源碼的核心版本:JDK-1.8,spring-5.2.4,spring-boot-2.2.5,在不同的版本下源碼會存在差異;

三、應用上下文

服務啟動時,根據應用類型判斷創建的上下文,此處啟動的是基于servlet的web應用,所以也依賴相應的web服務器,默認為Tomcat;

啟動方法的核心在于對應用上下文的創建、準備、刷新,應用上下文是一個十分抽象的描述,可以理解為應用運行的整體環境,其中涉及到資源加載,配置文件裝配,運行服務的管理等,后續的源碼分析都圍繞該API展開;

圖片

ApplicationContext:應用上下文核心接口,在該接口中所有的方法都是只讀模式,即只能通過Get方法進行訪問;

ConfigurableApplicationContext:上下文配置擴展接口,提供了應用上下文的配置能力,生命周期的維護,以及在關閉之后的相關資源釋放;

AbstractApplicationContext:上下文接口抽象實現,核心的API,對應用上下文中的公共能力做了實現;

ConfigurableWebApplicationContext:Web應用上下文配置擴展接口,提供了Web應用的上下文配置能力;

WebServerApplicationContext:Web服務上下文,創建并管理Web應用的服務器,在該流程中嵌入的是Tomcat服務;

根據應用上下文幾個核心的API設計,體會Spring源碼的設計思路,從頂級的接口開始,不斷向下擴展并且新增方法,理解抽象實現類的邏輯,以及服務運行時所依賴的具體API;

四、資源加載

什么是資源,可以是各種類型的文件和配置,字節輸入流的轉換,也可以是URL資源定位,Spring框架在運行的過程中,需要依賴Resource接口實現對底層資源的訪問;

圖片

Resource:資源描述的頂級接口,提供了一系列的方法,繼承InputStreamSource接口,支持將資源轉換為流的形式操作;

AbstractResource:資源訪問的抽象實現類,這里的設計原理與AbstractApplicationContext類似,提供資源訪問方法的基礎實現;

ResourceLoader:資源加載的封裝接口,應用下文需要依賴該接口實現資源的獲取與訪問;

針對不同應用場景需求,Resource接口的實現類有如下幾個:FileSystemResource文件系統資源,ClassPathResource類路徑下資源,InputStreamResource輸入流資源等;

五、應用環境

對于Property和Environment源碼設計體系,參考上述的源碼模塊,在思路上是相似的,此處不多描述;

圖片

應用程序的屬性和環境涉及到的參數描述非常多,比較直接的手段是通過System類中的方法輸出,至于信息如何加載,在StandardEnvironment類中提供了方法,可以斷點查看;

六、Bean對象

基于Spring框架的應用程序中,由Spring容器負責創建,裝配,設置屬性,進而管理整個生命周期的對象,稱為Bean對象;Bean的生命周期非常復雜,過程大致如下:實例化,屬性加載,初始化前后管理,銷毀;

圖片

BeanFactory:工廠類,Spring框架的核心能力,Bean容器的頂級接口,提供了一系列Bean對象的訪問方法,是IOC思想和依賴注入的基礎支撐;

ConfigurableBeanFactory:Bean容器可配置化接口,該擴展接口只是為了允許框架內部的即插即用和訪問bean工廠的配置方法;

AbstractBeanFactory:Bean管理的抽象實現類,可以查看其內部doGetBean方法,提供Bean實例對象的獲取邏輯,如果無法獲取則執行創建邏輯;

七、Tomcat服務

初次啟動SpringBoot工程時,最大的疑問就是可見Tomcat啟動日志,但是沒有顯式的做服務器裝配,直接啟動JAR包即可,這在流程上簡化了一大步;

圖片

WebServer:Web應用服務器接口,比如常用的Tomcat,Jetty,Netty等,根據應用類型選擇,只提供了啟動、停止、獲取端口三個方法,通過WebServerApplicationContext與應用上下文相關聯;

TomcatWebServer:SpringBoot框架管理內置Tomcat服務的核心類,對Tomcat生命周期的管理提供了一層包裝;

Tomcat:Apache組件中輕量級Tomcat啟動器,提供了Tomcat基礎配置,比如默認的Port和HostName,以及生命周期管理的方法,TomcatWebServer類中調用的就是該API中的具體方法;

八、事件模型

事件驅動模型是復雜流程中的常用解耦手段,即通過事件發送和監聽兩個拆解動作,實現流程的分步執行,這在SpringBoot啟動流程和上下文裝載中更是發揮的淋漓盡致;

圖片

ApplicationEvent:應用事件基礎抽象類,繼承自JDK中EventObject類,具體事件會繼承該類,內部聲明了事件源和發生時間兩個核心屬性;

ApplicationEventMulticaster:應用事件廣播的頂級接口,可以將指定的應用事件廣播給適合的監聽器;

SimpleApplicationEventMulticaster:應用事件廣播接口的簡單實現,可以斷點該類的multicastEvent方法,查看廣播時應用事件和其相應的監聽器;

ApplicationListener:應用事件監聽器接口,繼承自JDK中EventListener接口,Spring中擴展了多種具體的事件監聽器,以實現各種不同的場景需求,比如最常見的ConfigFileApplicationListener配置文件監聽器;

九、配置加載

SpringBoot工程中,配置文件的管理策略非常復雜,有內部程序執行加載配置,也有外部集成的組件配置,當然最核心的就是工程的自定義配置;

圖片

ConfigFileApplicationListener.Loader:配置文件監聽器的內部類,實現對工程中的配置源加載,其核心邏輯在Loader.load方法中實現,具體邏輯由相關的實現類完成;

PropertySourceLoader:配置加載的策略接口,在Spring工程中支持多種類型的文件配置,比如yml、yaml、properties、xml,需要通過文件的擴展名選擇相應的加載實現類;

YamlPropertySourceLoader:加載.yml或者.yaml類型的文件,SpringBoot工程中常用的配置文件類型,最終轉換成Name和Value的屬性源集合,即通過PropertySource抽象類來描述;

十、數據庫集成

Spring框架的強大之處還在于能夠和其他組件進行簡單快速的集成,比如常用的數據庫、緩存、消息隊列等各種類型的組件,分析內部的集成邏輯,會發現很多原理上的相似性,尤其在SpringBoot框架中,約定大于配置;

圖片

DataSourceAutoConfiguration:SpringBoot工程中數據庫的自動化配置類,在配置中Hikari是默認選擇的連接池,也是號稱速度最快的;

DataSourceProperties:數據源配置相關的基礎類,在DataSourceConfiguration配置類中,會基于參數去創建數據源對象;

HikariDataSource:Hikari連接池組件中的數據源API,描述數據源的具體信息,例如配置、連接池、狀態等,具體的數據庫連接邏輯是在該組件內部完成的;

基于SpringBoot集成數據庫的原理,可以擴展性的看看:Redis組件的RedisAutoConfiguration配置類;Kafka組件的KafkaAutoConfiguration配置類,Elasticsearch組件的RestClientAutoConfiguration配置類,在設計原理上都有異曲同工之妙;

寫在最后

從個人經驗來看,想要閱讀Spring框架的源碼設計,需要基于應用流程先構建一個大的輪廓結構,理解設計中的常用策略和原理,然后再深入單個模塊的細節邏輯,這樣容易找到閱讀節奏;

本文并沒有涉及源碼中過多的細節邏輯,只是從服務啟動作為切入點,整理與開發關聯性較為直接的源碼模塊,描述個人對于Spring源碼閱讀的基礎思路。

十一、參考源碼

應用倉庫: https://gitee.com/cicadasmile/butte-flyer-parent

組件封裝: https://gitee.com/cicadasmile/butte-frame-parent

責任編輯:武曉燕 來源: 知了一笑
相關推薦

2021-03-13 11:23:51

源碼邏輯框架

2021-03-10 08:20:54

設計模式OkHttp

2013-12-24 10:05:04

memcached

2023-10-07 09:16:55

SpringBoot啟動流程

2018-11-16 16:35:19

Java源碼編程語言

2017-03-16 11:39:33

Openstack源碼姿勢

2017-04-05 16:40:45

2012-02-14 14:05:59

JavaSpring

2024-11-04 06:00:00

redis雙向鏈表

2017-04-13 19:26:21

2021-03-13 14:08:00

Hadoop 源碼HDFS

2014-07-29 09:44:58

jQuery源碼

2021-12-20 07:58:59

GitHub源碼代碼

2021-08-02 09:50:47

Vetur源碼SMART

2018-03-28 16:10:23

閱讀源碼境界

2025-10-27 02:00:00

2017-03-27 15:15:43

Hive源碼編譯

2020-12-07 11:29:24

ReactVueVue3

2023-06-30 07:51:44

springboot初始化邏輯

2016-04-25 10:47:49

源碼閱讀學習
點贊
收藏

51CTO技術棧公眾號

国产成人在线免费| 777色狠狠一区二区三区| 97超碰人人看人人| 三妻四妾的电影电视剧在线观看| 91蜜桃在线免费视频| 91在线精品播放| 综合久久伊人| 777久久久精品| www.99av| 国产精品99久久久久| 91久久精品一区| 99蜜月精品久久91| 欧美一区二区精品在线| 少妇免费视频| 国产亚洲欧美中文| 一本二本三本亚洲码| 欧美视频在线观看| 国产精品久在线观看| 欧美日韩黄色| 亚洲天堂免费观看| 羞羞污视频在线观看| 欧美午夜性色大片在线观看| www.这里只有精品| eeuss国产一区二区三区| 免费观看国产成人| 成人久久一区| 日韩av免费在线看| 97久久综合精品久久久综合| 精品亚洲一区二区三区在线播放 | 韩国精品福利一区二区三区| 亚洲欧美激情视频| segui88久久综合9999| 宅男噜噜噜66一区二区66| 欧美91精品久久久久国产性生爱| 亚洲精品中文在线观看| 久久国产成人精品国产成人亚洲| 日本成人在线一区| 精品国产一区二区三区日日嗨| 不卡日本视频| 欧美一级视频在线观看| 日本高清精品| 久久99久久99精品中文字幕| 欧美激情不卡| 精品国产拍在线观看| 国产第一精品| 久久精视频免费在线久久完整在线看| 久久亚洲资源| 亚洲国产高清福利视频| 日本午夜大片a在线观看| 日韩成人中文字幕在线观看| 1024在线看片你懂得| 亚洲免费一在线| 欧美成人三级| 欧美激情亚洲国产| 老牛国内精品亚洲成av人片| 欧美一级淫片aaaaaaa视频| 菠萝蜜一区二区| 成人免费看片网站| 久久久国产亚洲精品| 天堂v在线视频| 成人av片在线观看| 77777在线| 日韩欧美主播在线| 国产理论在线观看| 国产午夜精品久久久| 国产免费av国片精品草莓男男| 久久91亚洲人成电影网站| 久久91精品| 国产精品美女久久久久av福利| 国产欧美精品久久| 国产激情片在线观看| 国产日本一区二区| 在线视频se| 亚洲国产天堂久久综合网| 日韩国产91| 国产精品免费在线免费| 亚洲欧美高清| 久久久免费视频网站| 亚洲国产成人av| 黄色成人在线| 蜜臀久久99精品久久久无需会员 | 免费一级欧美片在线观看网站| 91精品国产99久久久久久| 伊人青青综合网| 久久久99精品视频| 亚洲愉拍自拍另类高清精品| 免费av毛片在线看| 菠萝蜜影院一区二区免费| 波多野结衣在线观看一区二区三区| 成人欧美视频在线| 国产精品综合二区| 男女性激情视频在线观看| 日韩欧美在线1卡| 一区二区三区四区高清视频| aaa级精品久久久国产片| 国产很黄免费观看久久| 毛片视频免费观看| 亚洲精品一区二区三区四区高清| 国产区精品视频在线观看豆花| 亚洲最大福利网| 2020国产精品| 国模吧精品人体gogo| 少妇激情综合网| 欧美特黄一区| 无码少妇一区二区三区芒果| 欧美日韩一区二区三区视频| 深夜视频一区二区| 成人国产一区二区| 欧美经典一区二区| 国产天堂在线播放视频| 国产狼人综合免费视频| 成+人+亚洲+综合天堂| 99se视频在线观看| 欧美极品美女电影一区| 欧美a一区二区| 水中色av综合| 欧美人在线视频| 精品一二线国产| 91这里只有精品| 国产成人精品日本亚洲| 99视频一区二区三区| 草美女在线观看| 国产精品18毛片一区二区| 自拍偷在线精品自拍偷无码专区 | 日本不卡的三区四区五区| 免费av网页| 中文字幕精品视频| 日韩专区中文字幕一区二区| 亚洲一区视频在线观看视频| 天堂亚洲精品| 91免费国产网站| 国产精品久久久久7777按摩| 蜜桃精品在线| 亚洲高清123| 欧美日韩另类一区| 希岛爱理一区二区三区| 怡红院亚洲色图| 欧美成人第一页| 粉嫩久久99精品久久久久久夜| av香蕉成人| 日韩成人黄色av| 亚洲国产专区| 一区二区三区区四区播放视频在线观看 | 日韩在线成人| 欧美国产视频一区| 欧美精品一区二区三区很污很色的 | 开心色怡人综合网站| 亚洲成人一区二区| 亚洲精品aaaaa| 羞羞小视频视频| 欧美日韩国产va另类| aaa国产一区| 欧美人体一区二区三区| 男插女免费视频| 亚洲欧洲偷拍精品| 国产一区二区三区美女| 天堂8中文在线| 日韩高清国产一区在线观看| 欧美不卡在线视频| 久久精品二区亚洲w码| 草草视频在线观看| 日韩视频一二三| 中文字幕亚洲综合| 久久亚洲精品国产精品紫薇| 我要色综合中文字幕| 国产九九热视频| 国产成人精品a视频一区www| 亚洲自拍欧美精品| 欧美激情第10页| 性欧美1819sex性高清大胸| 亚洲一区精彩视频| 国产一区二区三区中文| 91免费精品国自产拍在线不卡| 四虎地址8848精品| а√最新版在线天堂| 国产精品视频精品| 欧美日韩亚洲综合一区二区三区| 亚洲综合三区| 中文字幕av一区二区三区佐山爱| 免费视频爱爱太爽了| 欧美激情国产日韩精品一区18| 中文字幕字幕中文在线中不卡视频| 中日韩免视频上线全都免费| 日本人妖在线| 日韩欧美一区二区在线观看| 亚洲码在线观看| 欧美国产乱子伦| 性xxxx欧美老肥妇牲乱| 伊人电影在线观看| 中文字幕无码精品亚洲资源网久久| 欧美日韩国产第一页| 婷婷成人激情在线网| 久久久国产精品一区二区中文| 国产超碰精品| 石原莉奈一区二区三区高清在线| 国产精品一区二区av| 国产亚洲精品久久久| 亚洲男人的天堂在线观看| 翔田千里一区二区| 日韩不卡在线视频|