日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

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

新聞中心

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

近一兩年, SpringBoot 由于其減少了大量原本繁瑣的 Spring 配置,以及基于 Boot 的 SpringCloud 的推廣,越來(lái)越多的應(yīng)用開(kāi)始使用 SpringBoot進(jìn)行開(kāi)發(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)站制作要多少錢(qián),請(qǐng)找那個(gè)售后服務(wù)好的岳塘做網(wǎng)站的公司定做!

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

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

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

在 Spring Boot 中,實(shí)現(xiàn)也基本類(lèi)似。 區(qū)別在于配置信息大部分是默認(rèn)的,另外一些用戶特定設(shè)置的,通過(guò)在 application.properties 之類(lèi)的 Boot 配置文件里,讀出來(lái)解析并設(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è)問(wèn)題,該從哪看起呢?

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

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

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

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

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

 
 
 
 
  1. this.tomcat.start(); 

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

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

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

  • Egine
  • Host
  • Context
  • Wrapper
  • Connector

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

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

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

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

我們知道,Spring MVC 是通過(guò) DispatcherServlet 來(lái)分發(fā)處理請(qǐng)求,在 Spring Boot 出現(xiàn)之前,都是需要在web.xml里配置,來(lái)實(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)用,然后再通過(guò)動(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 方法來(lái)啟動(dòng) Spring Boot 應(yīng)用,以 Web 應(yīng)用提供時(shí), Boot 的能力是如何提供的呢?

來(lái)看下面這張圖,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注解得到的類(lèi)數(shù)組,傳遞給ServletContainerInitializer的onStartup方法。

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

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

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

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

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


本文名稱(chēng):Tomcat 是怎樣處理 SpringBoot應(yīng)用的?
文章地址:http://www.5511xx.com/article/dpcsdce.html