日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Tomcat 是怎樣處理 SpringBoot應(yīng)用的?

近一兩年, SpringBoot 由于其減少了大量原本繁瑣的 Spring 配置,以及基于 Boot 的 SpringCloud 的推廣,越來越多的應(yīng)用開始使用 SpringBoot進(jìn)行開發(fā)。

岳塘網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)建站,岳塘網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為岳塘近1000家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站制作要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的岳塘做網(wǎng)站的公司定做!

而 SpringBoot 以標(biāo)準(zhǔn)Java 應(yīng)用的形式,來啟動(dòng)了一個(gè) Web 服務(wù),而將容器的存在,隱藏在一個(gè)配置文件中,使用起來很方便。而 Tomcat 就是 Spring Boot 內(nèi)置的容器之一。

這次我們來看在 SpringBoot 中, Tomcat 中怎樣被集成進(jìn)來提供服務(wù)的。

前面的文章寫過關(guān)于 Tomcat 的 Digester 組件解析 配置文件 server.xml, 根據(jù)配置信息生成 Tomcat 實(shí)例。

在 Spring Boot 中,實(shí)現(xiàn)也基本類似。 區(qū)別在于配置信息大部分是默認(rèn)的,另外一些用戶特定設(shè)置的,通過在 application.properties 之類的 Boot 配置文件里,讀出來解析并設(shè)置到 Tomcat 的各個(gè)組件上。

另外一個(gè)區(qū)別是, Spring Boot 使用的是 Embedded Tomcat 。

當(dāng)然,上面這兩點(diǎn),是整個(gè) Boot 項(xiàng)目中使用到 Tomcat 的基本原理,但具體對(duì)于 Embedded Tomcat 的使用,Boot 里和 Maven 插件的使用還是有一些區(qū)別的。

這是 Boot 使用的三個(gè)embedded 容器,默認(rèn)啟動(dòng)的是 Tomcat。

要分析這個(gè)問題,該從哪看起呢?

Boot 在啟動(dòng)的時(shí)候,很清楚的告訴我們這樣一條信息

s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port

我們看到的這一條是logback輸出的信息。前面是縮略形式寫的包名,最主要的是這個(gè)Container,跳轉(zhuǎn)到類里看一眼。

可以匹配到這一行 log 的, 是 container 的init 方法

前面一些細(xì)節(jié)類的內(nèi)容先不過多關(guān)注,進(jìn)入眼里的, 一定是這個(gè)

 
 
 
 
  1. this.tomcat.start(); 

這里這個(gè) tomcat ,就是 Embedded Tomcat類的實(shí)例。

這里 start 的操作,是將容器啟動(dòng)起來

方法里的 getServer, getConnector 這些, 熟悉 Tomcat 的朋友都了解,Tomcat 內(nèi)部有以下幾個(gè)主要的組件:

  • Egine
  • Host
  • Context
  • Wrapper
  • Connector

前四個(gè)是容器從上到下的組件,是一個(gè)包含的關(guān)系。而光有這些還不足以讓我們?cè)L問到部署的應(yīng)用,此時(shí)容器連接外界的組件 Connector 就顯的必不可少了。

而且,真正到了start 這一步的時(shí)候,容器的組件配置都已經(jīng)完成了,只是要啟動(dòng)以提供服務(wù)。 配置的這些讀取,都是在 initial 階段之前,已經(jīng)完成。

下圖是初始化階段讀取配置時(shí)的一些代碼, 沒有特別的地方,設(shè)置 BaseDir, 解析配置設(shè)置各個(gè)組件。

此外,在Spring Boot 應(yīng)用啟動(dòng)時(shí),會(huì)有這樣幾條日志輸出。

我們知道,Spring MVC 是通過 DispatcherServlet 來分發(fā)處理請(qǐng)求,在 Spring Boot 出現(xiàn)之前,都是需要在web.xml里配置,來實(shí)現(xiàn)請(qǐng)求的攔截。

而在Servlet 3.0 之后,規(guī)則中新增了Dynamic Servlet、Dynamic Filter這些概念, 可以在運(yùn)行時(shí)動(dòng)態(tài)注冊(cè)組件到 Context 中。

所以我們觀察到的 Context 僅僅是一個(gè)空的應(yīng)用,然后再通過動(dòng)態(tài)添加Servlet、 Filter 等內(nèi)容進(jìn)去。

除了以 Jar 的形式直接執(zhí)行 Main 方法外, Spring Boot 還支持將 Boot 應(yīng)用打包成 War 文件,部署到標(biāo)準(zhǔn)和容器中,不使用 Embedded 容器。

相比執(zhí)行 Main 方法來啟動(dòng) Spring Boot 應(yīng)用,以 Web 應(yīng)用提供時(shí), Boot 的能力是如何提供的呢?

來看下面這張圖,Jar文件的META-INF中services中包含一個(gè)SCI的聲明。

這就是Spring Boot 在標(biāo)準(zhǔn)Web容器中能生效的秘密。

SCI是做什么的呢?

容器啟動(dòng)時(shí)會(huì)依次處理每個(gè) ServletContainerInitializer 的HandlesTypes注解,然后分別調(diào)用所有ServletContainerInitializer對(duì)象的onStartup方法,并將處理HandlesTypes注解得到的類數(shù)組,傳遞給ServletContainerInitializer的onStartup方法。

在configure階段,我們將 Boot 打包成 war 時(shí)提供的Initalizer,并將其 run 起來。

此時(shí)處理 dispatcherServlet 這些,和 以Main方法啟動(dòng)執(zhí)行沒什么區(qū)別。

所以,當(dāng)我們看到 Boot 應(yīng)用能夠以如此少的配置便利的作為 Web 應(yīng)用執(zhí)行時(shí),要清楚的認(rèn)識(shí)到,背后的 Embedded 容器 還是做了不少工作,同時(shí)也是和各種新的 J2EE規(guī)范有關(guān)。 而最重要的是,無論怎么變化,本質(zhì)上還是那樣,做為一個(gè)標(biāo)準(zhǔn)的 Context 在使用,區(qū)別只在于是通過解析靜態(tài)文件進(jìn)行配置,還是通過動(dòng)態(tài)添加進(jìn)行配置。

【本文為專欄作者“侯樹成”的原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)通過作者微信公眾號(hào)『Tomcat那些事兒』獲取授權(quán)】

戳這里,看該作者更多好文


網(wǎng)站題目:Tomcat 是怎樣處理 SpringBoot應(yīng)用的?
當(dāng)前地址:http://www.dlmjj.cn/article/dpcsdce.html