一、關於容器
剛才開始使用spring boot的開發者會有種很直觀的感覺,servlet容器“不見了”。之前開發web項目,都是把程序寫完后部署到servlet容器(比如Tomcat),但是使用spring boot開發項目,寫完程序后直接就能運行了,覺得些許奇怪! 其實呢,這是因為Spring Boot中內嵌了Tomcat、Jetty和Undertow服務器。之所以開發者在默認情況下不需要做任何配置,是因為spring boot提供了一個名為EmbeddedServletContainerAutoConfiguration的配置類 (@Configuration注解的類),spring boot能實現“零配置”,是因為spring定義了好多這樣的配置類(配置沒有少,只是以前由開發者自己的工作交由spring完成了),這種情況下大多數開發人員將只需使用適當的“啟動器”來獲得一個完全配置的實例。spring-boot-starter-web默認使用嵌套式的Tomcat作為Web容器對外提供HTTP服務,默認端口8080對外監聽和提供服務。但同樣可以使用spring-boot-starter-jetty或者spring-boot-starter-undertow作為Web容器。
注意:如果您選擇在CentOS上使用Tomcat,默認情況下臨時目錄是用於存儲已編譯的jsp、文件上傳等。當應用程序運行導致失敗時,該目錄可以就被tmpwatch刪除。為了避免這一點,您可能需要定制您的tmpwatch配置。通過使用server.tomcat.basedir來配置內嵌的Tomcat。
1)內嵌容器選擇
- 在pom文件中排除tomcat的starter
<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>
- 增加Jetty依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jetty</artifactId> </dependency>
2)改變默認的配置端口,可以在application.properties中指定:
server.port = 9000(the port number you want)
3)類似的配置還有:
server.address server.ssl.* server.tomcat.*
如果上訴仍然沒有辦法滿足要求,springBoot支持對嵌入式的Web容器實例進行定制,可以通過向IoC容器中注冊一個EmbeddedServletContainerCustomizer類型的組件來對嵌入式的Web容器進行定制
public class UnveilSpringEmbeddedTomcatCustomizer implements EmbeddedServletContainer{ public void customize(ConfigurableEmbeddedServletContainer container){ container.setPort(9999); container.setContextPath("C\\hello"); ... } }
二、關於servlet、 Filters、listeners
在使用嵌入式servlet容器時,您可以注冊servlet、 Filters、listeners 。Servlet規范要么使用Spring bean,要么通過掃描Servlet組件。
1.通過Spring Bean注冊servlet、 Filters、listeners
默認情況下,如果上下文只包含一個Servlet,它將被映射到/。在多個情況下。Servlet bean bean的名稱將用作路徑前綴。過濾器將映射到/*。
如果基於約定的映射不夠靈活,可以使用ServletRegistrationBean、FilterRegistrationBean和ServletListenerRegistrationBean類進行完全控制。
Spring Boot附帶了許多可以定義過濾器bean的自動配置。下面是一些過濾器的例子和它們各自的順序(低order value意味着更高的優先級):
Servlet Filter | Order |
---|---|
|
|
|
|
|
|
|
|
通常,讓過濾bean處於無序狀態是安全的。
如果需要特定的順序,您應該避免篩選器程序讀取請求的Ordered.HIGHEST_PRECEDENCE值。因為它可能違背應用程序的字符編碼配置。如果Servlet篩選器包裝請求,它應該配置一個小於或等於FilterRegistrationBean.REQUEST_WRAPPER_FILTER_MAX_ORDER的順序。