1. 程式人生 > >【原始碼解析】憑什麼?spring boot 一個 jar 就能開發 web 專案

【原始碼解析】憑什麼?spring boot 一個 jar 就能開發 web 專案

問題

為什麼開發web專案,spring-boot-starter-web 一個jar就搞定了?這個jar做了什麼?

通過 spring-boot 工程可以看到所有開箱即用的的引導模組 spring-boot-starter-xxx 都在 spring-boot-starters 子模組中,且所有的 spring-boot-starter-xxx 模組中都沒有程式碼,都是在其他包中就完成對應的功能。首先,分析其依賴

依賴

注意:圖中的 Jakarta.xxxx 包是原來的 javax.xxxx 包,Java EE 改名為 Jakarta EE 了,spring-boot-starter-web-2.1.8.RELEASE

版本是直接依賴於hibernate-validator,spring-boot-2.2.0 版本開始使用的是 Jakarta,並用一個新模組 spring-boot-starter-validation 來管理

從依賴圖中可以看到,最核心的 spring-boot 依賴於 spring-contextspring-core ,因此,正如官方所說,spring-boot 是基於 spring 的。

spring boot可以輕鬆地建立可執行的、獨立的、生產級的基於spring的應用程式。我們對spring平臺和第三方庫有自己的見解,這樣您就可以從最少的麻煩開始了。大多數spring引導應用程式只需要很少的spring配置。

可以使用 Spring Boot 建立Java應用程式,Java應用程式可以通過使用 java -jar 或更傳統的war 來部署。我們還提供了一個執行“spring指令碼”的命令列工具。

我們首要的目標是:

  • 為所有spring開發提供一個更快、更容易獲得的入門體驗。
  • 開箱即用,但要在需求開始偏離預設值時迅速改變。
  • 提供一系列對大型專案通用的非功能性特性(如嵌入式伺服器、安全性、流量、執行狀況檢查和外部化配置)。
  • 絕對不需要程式碼生成,也不需要XML配置。

【spring-boot 原始碼解析】spring-boot 依賴管理

【spring-boot 原始碼解析】spring-boot 依賴管理梳理圖

spring-boot-starter(重要)

此模組是所有 spring-boot-starter-xxxx 引導器核心,非常重要!!!

包含以下模組:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-logging</artifactId>
</dependency>
<dependency>
    <groupId>javax.annotation</groupId>
    <artifactId>javax.annotation-api</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
</dependency>
<dependency>
    <groupId>org.yaml</groupId>
    <artifactId>snakeyaml</artifactId>
    <scope>runtime</scope>
</dependency>

spring-boot

spring-boot 核心,spring-boot 特性功能都是在此包實現。

spring-boot-autoconfigure

spring-boot 自動配置,提供一些常用包的預設配置

【原始碼解析】自動配置的這些細節不知道,別說你會 spring-boot

spring-boot-starter-logging

spring-boot 預設日誌引導器

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-to-slf4j</artifactId>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jul-to-slf4j</artifactId>
</dependency>

什麼都沒做,就引入了幾個依賴,那引入這幾個依賴解決了什麼問題呢?
通過引入這幾個依賴,直接或間接的引入了 slf4j、logback日誌框架所需jar,以及 log4j、jul日誌工具對 Slf4j的適配。
因此,引入了這個jar,工程中的日誌實現使用 logback。
嗯?那 log4j2 呢?
原來如果想用 log4j2,還有一個 spring-boot-starter-log4j2 包供我們選擇。

日誌的具體配置,建議還是用原本的 xml 配置,用 yaml 或 properties 不好配置。
如:logback 使用根目錄下的 logback-spring.xml 配置。

snakeyaml

支援yaml語法的生成與解析工具包

SnakeYaml快速入門

spring-boot-starter-tomcat

沒有做任何處理,直接使用嵌入式 tomcat 相關jar。spring 專案由外部 tomcat 呼叫 spring框架,而 spring-boot 是由 框架內部去呼叫嵌入式 tomcat,主被動關係發生了轉化。


<!-- 相當於去掉的tomcat-annotations-api -->
<dependency>
    <groupId>javax.annotation</groupId>
    <artifactId>javax.annotation-api</artifactId>
</dependency>
<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-core</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>tomcat-annotations-api</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-el</artifactId>
</dependency>
<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-websocket</artifactId>
</dependency>

spring-boot-starter-json

沒有做任何處理,使用 jackson 作為預設json工具

<dependency>
   <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jdk8</artifactId>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.module</groupId>
    <artifactId>jackson-module-parameter-names</artifactId>
</dependency>

spring-boot-starter-validation

2.1.8.RELEASE 版本直接依賴於 hibernate-validator,沒有此模組

2.2.0 版本依賴於 Jakarta.validation-api 和 hibernate-validator,並去掉了 hibernate-validator中的 javax.validation-api。

兩者在使用的時候沒有任何區別,是無感切換的。

validator 自動化校驗

<!-- 2.2.0.M6 -->

<!-- 相當於去掉的javax validation-api -->
<dependency>
    <groupId>jakarta.validation</groupId>
    <artifactId>jakarta.validation-api</artifactId>
</dependency>
<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-el</artifactId>
</dependency>

<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
    <exclusions>
        <exclusion>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
        </exclusion>
    </exclusions>
</dependency>

參考資料

  • spring-boot-2.1.8 原始碼
  • 【spring-boot 原始碼解析】spring-boot 依賴管理
  • 【spring-boot 原始碼解析】spring-boot 依賴管理梳理圖
  • validator 自動化校驗
  • 【原始碼解析】自動配置的這些細節不知道,別說你會 spring-boot
  • 架構師必備,帶你弄清混亂的JAVA日誌體系
    公眾號:逸飛兮(專注於 Java 領域知識的深入學習,從原始碼到原理,系統有序的學習)

相關推薦

原始碼解析什麼?spring boot 一個 jar 開發 web 專案

問題 為什麼開發web專案,spring-boot-starter-web 一個jar就搞定了?這個jar做了什麼? 通過 spring-boot 工程可以看到所有開箱即用的的引導模組 spring-boot-starter-xxx 都在 spring-boot-starters 子模組中,且所有的 sp

影象語義分割:從頭開始訓練deeplab v2系列之一原始碼解析

好記性不如爛筆頭, 最近用Deeplab v2跑的影象分割,現記錄如下。 官方原始碼地址如下:https://bitbucket.org/aquariusjay/deeplab-public-ver2/overview 但是此原始碼只是為deeplab網路

原始碼解析自動配置的這些細節都不知道,別說你會 springboot

spring-boot 相對於 spring,很重要的一個特點就是自動配置,使約定大於配置思想成功落地。xxx-spring-boot-starter 一系列引導器能夠開箱即用,或者只需要很少的配置(對於初學人員)就是因為已做了預設的自動配置。 自動配置在一開始就初始化了一些配置,同時提供修改配置的入口。 整

Spring boot + Mybatis(基於xml配置方式) WEB專案

一.工具(idea) 二.建立專案 最後finish; 3.配置與編寫demo     目錄: 3.1 springBoot配置檔案:application.yml;也可使用properties檔案 spring: #資料來源配置 datas

Shiro許可權控制框架 ---SpringMVC+Spring+My batis+Mysql+Maven整合開發Web專案

在之前的博文簡單的介紹shiro許可權控制框架,現在我們接著講解使用    SpringMVC+Spring+My batis+Mysql+Maven整合開發Web專案 1.先由Maven選擇MavenProject建立一個Web專案(如果你還不會使用Maven的話可以去看

spring-boot 原始碼解析spring-boot 依賴管理

關鍵詞:spring-boot 依賴管理、spring-boot-dependencies、spring-boot-parent 問題 maven 工程,依賴管理是非常基本又非常重要的功能,現在的工程越來越龐大,依賴越來越多,各種二方包、三方包太多太多,依賴衝突處理起來真是讓人頭疼,經常需要涉及到多個地方需要

spring-boot 原始碼解析spring-boot 依賴管理梳理圖

在文章 【spring-boot 原始碼解析】spring-boot 依賴管理 中,我梳理了 spring-boot-build、spring-boot-parent、spring-boot-dependencies、spring-boot-starter-parent 依賴之間的關係,以及我們平常應該怎麼用

資料新增非同步解析重新整理大資料量redis (——)(三)Spring Boot普通類呼叫bean從零開始學Spring Boot

部落格分類:  從零開始學Spring Boot 從零開始學Spring BootSpring Boot普通類呼叫bean    【視訊&交流平臺】 à SpringBoot視訊 http://stu

(4)Spring Boot完美使用FastJson解析JSON資料從零開始學Spring Boot

個人使用比較習慣的json框架是fastjson,所以spring boot預設的json使用起來就很陌生了,所以很自然我就想我能不能使用fastjson進行json解析呢? 引入fastjson依賴庫:   <dependencies>         <

直播預告:Java Spring Boot開發實戰系列課程第12講Spring Boot 2.0效能監控實戰與Actuator機制解析

主講人:徐雷(阿里雲棲特邀Java專家)徐雷,花名:徐雷frank;資深架構師,MongoDB中文社群聯席主席,吉林大學計算機學士,上海交通大學碩士。從事了 10年+開發工作,專注於分散式架構,Java Spring Boot、Spring Cloud、MongoDB、Redis。 喜歡專研技術問題,擅長講

78. Spring Boot完美使用FastJson解析JSON資料從零開始學Spring Boot

【原創文章,轉載請註明出處】        個人使用比較習慣的json框架是fastjson,所以spring boot預設的json使用起來就很陌生了,所以很自然我就想我能不能使用fastjson進行json解析呢? 引入fastjson依賴庫:   <depen

Spring原始碼解析—— 結合SpringMVC過程理解IOC容器初始化之註解部分探究

前面的文章寫了xml中直接配置bean進行IOC的過程解析,接下來會針對註解進行IOC容器初始化的過程解析 因為會與之前的內容存在部分重疊,因此會針對相同的部分簡略帶過,針對不同的部分做重點說明:   一、Xml的配置和程式碼中的註解配置: applicationContext.xml配置新

Spring原始碼解析—— 簡單工廠模式的BeanFactory的超簡版實現

 一、什麼是簡單工廠模式 設計模式的核心是“分工”,通過分工將物件與職責劃分的更細化,進而提升系統設計的可擴充套件性,使其更容易維護。   開閉原則:對擴充套件開放,對修改關閉;要增加一個新的處理邏輯,可以開一個新的類,不要在老的上面修改 依賴倒轉原則:依賴關係從具體轉向抽象,也就是說:A

Spring原始碼解析FactoryBean-工廠方法模式的實現及使用

一、工廠方法模式中的三種模式的特點 工廠模式中的三種模式,分別是:簡單工廠模式、工廠方法模式、抽象工廠模式,三種分別是什麼,以及適合場景是什麼? (1)簡單工廠模式:一個抽象介面對應一個產品介面,特定產品實現這個介面,針對不同產品都可以在同一個工廠中生產,同一個工廠生產產品可以通過多種方式,單生產方法(通

Spring原始碼解析—— 策略模式在Spring中的應用

一、         什麼是策略模式 策略模式的定義/含義:策略本身就是為了實現某一個目標而採取的一種工作方式,因此只要能夠達成目標,則採取哪一種策略都可以;因此多種實際的策略之間是相互平行的。 注意:策略模式與模板模式是不同

spring-boot實戰07Spring BootWeb應用的統一異常處理

http integer private fin ima lex clas 友好 ref 我們在做Web應用的時候,請求處理過程中發生錯誤是非常常見的情況。Spring Boot提供了一個默認的映射:/error,當處理中拋出異常之後,會轉到該請求中處理,並且該請求有一個全

spring-boot實戰06Spring Boot中使用Swagger2

des values 產生 service sof div 解決 整合 data 由於Spring Boot能夠快速開發、便捷部署等特性,相信有很大一部分Spring Boot的用戶會用來構建RESTful API。而我們構建RESTful API的目的通常都是由於多終端的

spring-boot實戰12Spring Boot中使用JavaMailSender發送郵件

nts fun rop oci 單元測試 prop 快速入門 cat tid 相信使用過Spring的眾多開發者都知道Spring提供了非常好用的JavaMailSender接口實現郵件發送。在Spring Boot的Starter模塊中也為此提供了自動化配置。下面通過實例

spring-boot實戰08Spring Boot屬性配置文件詳解

命令行 可見 str ear isp active 文件加載 junit4 實驗 相信很多人選擇Spring Boot主要是考慮到它既能兼顧Spring的強大功能,還能實現快速開發的便捷。我們在Spring Boot使用過程中,最直觀的感受就是沒有了原來自己整合Spring

spring boot3.spring boot項目,綁定資源文件為bean並使用

display fig 屬性綁定 factor pin none rand actor tag 整個例子的結構目錄如下: 1.自定義一個資源文件 com.sxd.name = 申九日木 com.sxd.secret = ${random.value} com.sx