SpringBoot嵌入式容器詳細(xì)介紹
概述
Spring Boot支持嵌入式Tomcat、Jetty和Undertow服務(wù)器。大多數(shù)開發(fā)人員使用適當(dāng)?shù)?“starter”來獲得完全配置的實例。默認(rèn)情況下,嵌入式服務(wù)器在端口8080上監(jiān)聽HTTP請求。
默認(rèn)引入下面依賴使用Tomcat服務(wù)器。
如需要使用其它如Undertow作為服務(wù)器只需要如下依賴即可。
Servlets, Filters, and listeners
當(dāng)使用嵌入式servlet容器時,可以通過使用Spring bean或掃描servlet組件來注冊servlet、filter和servlet規(guī)范中的所有監(jiān)聽器(如HttpSessionListener)。
Registering Servlets, Filters, and Listeners as Spring Beans
任何Spring bean的Servlet、Filter或 *Listener實例都注冊到嵌入式容器中。如果你想從應(yīng)用程序中引用一個值,這可能特別方便。配置過程中的屬性。
默認(rèn)情況下,如果上下文只包含單個Servlet,則將其映射到/。在有多個servlet bean的情況下,bean名用作路徑前綴。Filter映射到/*。
如果基于約定的映射不夠靈活,可以使用ServletRegistrationBean、FilterRegistrationBean和ServletListenerRegistrationBean類進(jìn)行完全控制。
通常情況下,將Filter Bean放置無序是安全的。如果需要特定的順序,則應(yīng)該使用@Order注釋過濾器,或者讓它實現(xiàn)Ordered。你不能通過給過濾器的bean方法加上@Order注解來配置它的順序。如果不能更改過濾器類以添加@Order或?qū)崿F(xiàn)Ordered,則必須為過濾器定義一個FilterRegistrationBean,并使用setOrder(int)方法設(shè)置注冊bean的訂單。避免配置按順序讀取請求體的過濾器。
注:要查看應(yīng)用程序中每個過濾器的順序,請為web日志組啟用調(diào)試級別日志(logging.level.web=debug)。注冊過濾器的詳細(xì)信息,包括它們的順序和URL模式,將在啟動時記錄下來。
Servlet Context Initialization
嵌入式servlet容器不會直接執(zhí)行servlet 3.0+javax.servlet.ServletContainerInitializer接口或Spring的org.springframework.web.WebApplicationInitializer接口。這樣做是有意為之,目的是降低在war中運行的第三方庫破壞Spring Boot應(yīng)用程序的風(fēng)險。
如果需要在Spring Boot應(yīng)用程序中執(zhí)行servlet上下文初始化,應(yīng)該注冊一個實現(xiàn)org.springframework.boot.web.servlet.ServletContextInitializer接口的bean。單一的onStartup方法提供了對ServletContext的訪問,如果有必要,可以很容易地將其用作現(xiàn)有WebApplicationInitializer的適配器。
掃描 Servlets, Filters, and listeners。
在使用嵌入式容器時,可以通過使用@ServletComponentScan?來啟用自動注冊帶有@WebServlet、@WebFilter和@WebListener注解的類。
容器之ServletWebServerApplicationContext
在底層,Spring Boot使用了另一種類型的ApplicationContext來支持嵌入式servlet容器。ServletWebServerApplicationContext是一種特殊類型的WebApplicationContext,它通過搜索單個ServletWebServerFactory bean來引導(dǎo)自己。通常TomcatServletWebServerFactory、JetttyServletWebServerFactory或UndertowServletWebServerFactory都是自動配置的。
你通常不需要知道這些實現(xiàn)類。大多數(shù)應(yīng)用程序都是自動配置的,并且創(chuàng)建適當(dāng)?shù)?nbsp;ApplicationContext和ServletWebServerFactory。
在嵌入式容器設(shè)置中,ServletContext被設(shè)置為服務(wù)器啟動的一部分,該啟動發(fā)生在應(yīng)用程序上下文初始化期間。因此,ApplicationContext中的bean不能可靠地用ServletContext進(jìn)行初始化。解決這個問題的一種方法是注入ApplicationContext作為bean的依賴項,并僅在需要時訪問ServletContext。另一種方法是在服務(wù)器啟動后使用回調(diào)函數(shù)。這可以使用ApplicationListener來監(jiān)聽ApplicationStartedEvent,如下所示:
自定義Servlet容器
可以使用Spring環(huán)境屬性來配置公共servlet容器設(shè)置。application.properties或application.yaml文件。
常見的服務(wù)器設(shè)置包括:
- 網(wǎng)絡(luò)設(shè)置:監(jiān)聽傳入的HTTP請求的端口(server.port),綁定到server.address。地址,等等。
- Session設(shè)置:會話是否持久(server.servlet.session.persistent),會話超時(server.servlet.session.timeout),會話數(shù)據(jù)的位置(server.servlet.session.store-dir),以及會話cookie配置(server.servlet.session.cookie.*)。
- 錯誤管理:錯誤頁面的位置(server.error.path)等。
- SSL
- HTTP compression
編程方式自定義配置
如果需要以編程方式配置嵌入式servlet容器,可以注冊一個實現(xiàn)WebServerFactoryCustomizer接口的Spring bean。WebServerFactoryCustomizer提供了對ConfigurableServletWebServerFactory的訪問,其中包括許多自定義設(shè)置方法。示例:
TomcatServletWebServerFactory,JetttyServletWebServerFactory和UndertowServletWebServerFactory是ConfigurableServletWebServerFactory的子類,它們分別為Tomcat, Jetty和Undertow提供了額外的自定義設(shè)置方法。示例:
JSP限制
當(dāng)運行一個使用嵌入式servlet容器的Spring Boot應(yīng)用程序(打包為可執(zhí)行的歸檔文件)時,對JSP的支持有一些限制。
- 使用Jetty和Tomcat,如果你使用war打包,它應(yīng)該可以正常工作。當(dāng)使用java -jar啟動時,不支持jsp。
- Undertow不支持jsp。
- 創(chuàng)建自定義error.jsp頁面不會覆蓋錯誤處理的默認(rèn)視圖。應(yīng)該使用自定義錯誤頁面。