SpringBoot嵌入式Web容器原理與使用介紹
嵌入式 Web 容器:應(yīng)用中內(nèi)置服務(wù)器(Tomcat),不用在外部配置服務(wù)器了
原理
- SpringBoot 項(xiàng)目啟動,發(fā)現(xiàn)是 web 應(yīng)用,引入 web 場景包 ----- 如:Tomcat
- web 應(yīng)用創(chuàng)建一個(gè) web 版的 IOC 容器 ServletWebServerApplicationContext
- ServletWebServerApplicationContext 啟動的時(shí)候?qū)ふ?ServletWebServerFactory (Servlet 的 web 服務(wù)器工廠,用于生產(chǎn) Servlet 服務(wù)器)
- ServletWebServerFactory 底層默認(rèn)有很多 Web 服務(wù)器工廠
- 底層會自動配置好 ,自動配置類 ServletWebServerFactoryAutoConfiguration
- ServletWebServerFactoryAutoConfiguration 導(dǎo)入 ServletWebServerFactoryConfiguration 工廠配置類
ServletWebServerFactoryConfiguration.class
- 動態(tài)判斷系統(tǒng)中導(dǎo)入了那個(gè)web服務(wù)器配置包
- 如果導(dǎo)入 Tomcat 依賴,會自動放一個(gè) Tomcat 服務(wù)器工廠, TomcatServletWebServerFactory 為我們創(chuàng)建出 Tomcat 服務(wù)器工廠
- Tomcat 底層支持如下服務(wù)器
@Override public WebServer getWebServer(ServletContextInitializer... initializers) { if (this.disableMBeanRegistry) { Registry.disableRegistry(); } Tomcat tomcat = new Tomcat(); File baseDir = (this.baseDirectory != null) ? this.baseDirectory : createTempDir("tomcat"); tomcat.setBaseDir(baseDir.getAbsolutePath()); Connector connector = new Connector(this.protocol); connector.setThrowOnFailure(true); tomcat.getService().addConnector(connector); customizeConnector(connector); tomcat.setConnector(connector); tomcat.getHost().setAutoDeploy(false); configureEngine(tomcat.getEngine()); for (Connector additionalConnector : this.additionalTomcatConnectors) { tomcat.getService().addConnector(additionalConnector); } prepareContext(tomcat.getHost(), initializers); return getTomcatWebServer(tomcat); }
總結(jié): 所謂內(nèi)嵌服務(wù)器,就是把我們手動啟動服務(wù)器的方法放進(jìn)框架中了。
應(yīng)用
1. 切換Web服務(wù)器
排除 tomcat 服務(wù)器,導(dǎo)入 undertow 依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-undertow</artifactId> </dependency>
2. 定制服務(wù)器規(guī)則
方法一: 修改 server 下的配置文件
ServerProperties.class
server.undertow.accesslog.dir=/tmp
方法二: 自定義 ConfigurableServletWebServerFactory
方法三: 自定義 ServletWebServerFactoryCustomizer 定制化器
作用: 將配置文件的值,與 ServletWebServerFactory 綁定
SpringBoot 設(shè)計(jì): Customizer 定制化器,可以定制 XXX 規(guī)則
到此這篇關(guān)于SpringBoot嵌入式Web容器原理與使用介紹的文章就介紹到這了,更多相關(guān)SpringBoot嵌入式Web容器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot中@EnableAutoConfiguration和@Configuration的區(qū)別
這篇文章主要介紹了SpringBoot中@EnableAutoConfiguration和@Configuration的區(qū)別,@SpringBootApplication相當(dāng)于@EnableAutoConfiguration,@ComponentScan,@Configuration三者的集合,需要的朋友可以參考下2023-08-08SSM項(xiàng)目中使用攔截器和過濾器的實(shí)現(xiàn)示例
這篇文章主要介紹了SSM項(xiàng)目中使用攔截器和過濾器的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04Java GraphQL數(shù)據(jù)加載器批處理的實(shí)現(xiàn)詳解
GraphQL 數(shù)據(jù)加載器是優(yōu)化 GraphQL API 的關(guān)鍵組件,旨在解決臭名昭著的 N+1 查詢問題,在本中,我們將深入研究其批處理功能,感興趣的小伙伴可以了解下2023-12-12Idea自定義方法注釋模板的教程詳解(去param括號、return全類名)
這篇文章主要介紹了Idea自定義方法注釋模板(去param括號、return全類名),本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08面試題:Java 實(shí)現(xiàn)查找旋轉(zhuǎn)數(shù)組的最小數(shù)字
這篇文章主要介紹了Java 實(shí)現(xiàn)查找旋轉(zhuǎn)數(shù)組的最小數(shù)字,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-07-07Java實(shí)現(xiàn)二叉搜索樹的插入、刪除功能
這篇文章主要介紹了Java實(shí)現(xiàn)二叉搜索樹的插入、刪除,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-01-01windows環(huán)境下java開發(fā)工具maven的安裝教程圖解
Maven是一個(gè)項(xiàng)目管理和綜合工具。Maven提供了開發(fā)人員構(gòu)建一個(gè)完整的生命周期框架。這篇文章主要介紹了windows環(huán)境下java開發(fā)工具maven的安裝,非常不錯(cuò)對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07Springboot中Instant時(shí)間傳參及序列化詳解
這篇文章主要介紹了Springboot中Instant時(shí)間傳參及序列化詳解,Instant是Java8引入的一個(gè)精度極高的時(shí)間類型,可以精確到納秒,但實(shí)際使用的時(shí)候不需要這么高的精確度,通常到毫秒就可以了,需要的朋友可以參考下2023-11-11