成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Tomcat 是怎樣處理 SpringBoot應用的?

開發 開發工具
SpringBoot以標準Java 應用的形式,來啟動了一個Web服務,而將容器的存在,隱藏在一個配置文件中,使用起來很方便。而Tomcat 就是Spring Boot內置的容器之一。這次我們來看在SpringBoot中,Tomcat中怎樣被集成進來提供服務的。

[[202225]]

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

而 SpringBoot 以標準Java 應用的形式,來啟動了一個 Web 服務,而將容器的存在,隱藏在一個配置文件中,使用起來很方便。而 Tomcat 就是 Spring Boot 內置的容器之一。

這次我們來看在 SpringBoot 中, Tomcat 中怎樣被集成進來提供服務的。

前面的文章寫過關于 Tomcat 的 Digester 組件解析 配置文件 server.xml, 根據配置信息生成 Tomcat 實例。

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

另外一個區別是, Spring Boot 使用的是 Embedded Tomcat 。

當然,上面這兩點,是整個 Boot 項目中使用到 Tomcat 的基本原理,但具體對于 Embedded Tomcat 的使用,Boot 里和 Maven 插件的使用還是有一些區別的。

這是 Boot 使用的三個embedded 容器,默認啟動的是 Tomcat。

embedded 容器

要分析這個問題,該從哪看起呢?

Boot 在啟動的時候,很清楚的告訴我們這樣一條信息

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

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

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

container 的init 方法

前面一些細節類的內容先不過多關注,進入眼里的, 一定是這個

  1. this.tomcat.start(); 

這里這個 tomcat ,就是 Embedded Tomcat類的實例。

這里 start 的操作,是將容器啟動起來

將容器啟動起來

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

  • Egine
  • Host
  • Context
  • Wrapper
  • Connector

前四個是容器從上到下的組件,是一個包含的關系。而光有這些還不足以讓我們訪問到部署的應用,此時容器連接外界的組件 Connector 就顯的必不可少了。

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

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

此外,在Spring Boot 應用啟動時,會有這樣幾條日志輸出。

我們知道,Spring MVC 是通過 DispatcherServlet 來分發處理請求,在 Spring Boot 出現之前,都是需要在web.xml里配置,來實現請求的攔截。

而在Servlet 3.0 之后,規則中新增了Dynamic Servlet、Dynamic Filter這些概念, 可以在運行時動態注冊組件到 Context 中。

所以我們觀察到的 Context 僅僅是一個空的應用,然后再通過動態添加Servlet、 Filter 等內容進去。

除了以 Jar 的形式直接執行 Main 方法外, Spring Boot 還支持將 Boot 應用打包成 War 文件,部署到標準和容器中,不使用 Embedded 容器。

相比執行 Main 方法來啟動 Spring Boot 應用,以 Web 應用提供時, Boot 的能力是如何提供的呢?

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

這就是Spring Boot 在標準Web容器中能生效的秘密。

SCI是做什么的呢?

容器啟動時會依次處理每個 ServletContainerInitializer 的HandlesTypes注解,然后分別調用所有ServletContainerInitializer對象的onStartup方法,并將處理HandlesTypes注解得到的類數組,傳遞給ServletContainerInitializer的onStartup方法。

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

此時處理 dispatcherServlet 這些,和 以Main方法啟動執行沒什么區別。

所以,當我們看到 Boot 應用能夠以如此少的配置便利的作為 Web 應用執行時,要清楚的認識到,背后的 Embedded 容器 還是做了不少工作,同時也是和各種新的 J2EE規范有關。 而最重要的是,無論怎么變化,本質上還是那樣,做為一個標準的 Context 在使用,區別只在于是通過解析靜態文件進行配置,還是通過動態添加進行配置。

【本文為51CTO專欄作者“侯樹成”的原創稿件,轉載請通過作者微信公眾號『Tomcat那些事兒』獲取授權】

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

責任編輯:趙寧寧 來源: 51CTO專欄
相關推薦

2018-06-24 08:53:42

Tomcat理搜索引擎爬蟲

2020-04-28 22:58:33

Tomcat架構Service

2019-08-15 16:30:49

TomcatSpringBootJava

2017-01-12 21:02:29

Windows 10系統更新

2021-04-30 20:25:20

Spring MVCJava代碼

2016-11-18 20:24:03

人工智能識別應用軟件

2016-01-11 10:25:56

2021-01-18 05:13:04

TomcatHttp

2010-03-24 15:40:39

網管運維管理摩卡軟件

2020-10-27 07:34:41

基站手機蜂窩網絡

2017-09-04 14:40:00

LimitLatchTomcat線程

2019-05-29 10:42:06

大數據IT人工智能

2015-09-06 09:09:13

2014-06-20 10:34:42

開源

2010-03-02 14:21:20

Linux死機

2015-11-10 09:09:23

代碼程序員成長

2024-03-28 08:13:51

GPTsOpenAI人工智能

2011-11-25 09:48:04

天線無線

2013-08-19 16:17:48

CIO

2009-09-02 20:18:17

域名劫持域名安全
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美精品一区二区免费 | 噜久寡妇噜噜久久寡妇 | 五月天婷婷丁香 | 国产精品18hdxxxⅹ在线 | 一区二区三区四区不卡视频 | 羞羞视频网站免费观看 | 国产成人在线播放 | 在线免费看黄 | 国产精品久久久久无码av | 91精品国产综合久久久久久丝袜 | 日本成人片在线观看 | 亚洲社区在线 | 国产精品爱久久久久久久 | 91中文在线观看 | 久久成人精品视频 | 久久精品一区二区三区四区 | 久久tv在线观看 | 中文字幕精品一区二区三区精品 | ww亚洲ww亚在线观看 | 欧美日韩午夜精品 | 91人人视频在线观看 | 欧美在线观看一区 | 日韩中文字幕一区二区 | 免费成人在线网站 | 久久久九九 | 成人免费网站视频 | 久久久国产亚洲精品 | 99久久免费精品 | 欧美一级在线免费 | 欧洲一区二区视频 | 日韩在线播放中文字幕 | 伊人一区 | 亚洲精品9999久久久久 | 午夜欧美一区二区三区在线播放 | 在线国产中文字幕 | 欧美xxxⅹ性欧美大片 | 日韩毛片免费看 | 综合精品久久久 | 精品一区二区在线视频 | 天天干天天干 | 美国十次成人欧美色导视频 |