Spring boot 默認使用Tomcat作為嵌入式Servlet容器,只需要引入spring-boot-start-web依賴,默認采用的Tomcat作為容器

01 定制和修改Servlet容器的相關配置(ServerProperties是EmbeddedServletContainerCustomizer的子類)
server.port=8080 server.context-path=/ # tomcat相關設置 server.tomcat.uri-encoding=UTF-8
也可以編寫EmbeddedServletContainerCustomizer(嵌入式的Servlet容器定制器),來修改servlet容器的配置
@Bean public EmbeddedServletContainerCustomizer embeddedServletContainerCustomizer(){ //定制嵌入式的Servlet容器相關的屬性配置 return container -> container.setPort(8083); }
2 注冊Servlet容器的三大組件(Servlet Filter Listener)
spring boot默認采用是以jar包的形式啟動嵌入式的servlet容器,從而啟動Springboot的web應用,沒有web.xml,當然也可以使用注解的方式(@WebServlet,@WebListener,@WebFilter),現在使用Spring boot作為框架,如果編寫三大組件,則需要使用配置的方式進行注冊
01 ServletRegistrationBean:注冊Servlet
//Servlet定義 public class MyServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("這是一個servlet請求..."); } } //Servlet注冊 @Configuration public class MyServletConfig { //注冊Servlet @Bean public ServletRegistrationBean myServlet(){ return new ServletRegistrationBean(new MyServlet(), "/myServlet"); } }
02 FilterRegistrationBean:注冊Filter
//Filter定義 public class MyFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("MyFilter process..."); //放行 chain.doFilter(request, response); } @Override public void destroy() { } } //Filter注冊 @Bean public FilterRegistrationBean myFilter(){ FilterRegistrationBean bean = new FilterRegistrationBean(); bean.setFilter(new MyFilter()); bean.setUrlPatterns(Arrays.asList("/hello", "/myServlet")); return bean; }
ServletListenerRegistrationBean:注冊Listener
//Listener定義 public class MyListener implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent sce) { System.out.println("contextInitialized...web啟動"); } @Override public void contextDestroyed(ServletContextEvent sce) { System.out.println("contextDestroyed...web銷毀"); } } //Listener注冊 @Bean public ServletListenerRegistrationBean myListener(){ return new ServletListenerRegistrationBean<>(new MyListener()); }
最熟悉的是,spring boot 在自動配置springMVC,會自動注冊SpringMVC前端控制器:DispatcherServlet,該控制器主要在DispatcherServletAutoConfiguration自動配置類中進行注冊
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE) @Configuration @ConditionalOnWebApplication @ConditionalOnClass(DispatcherServlet.class) @AutoConfigureAfter(EmbeddedServletContainerAutoConfiguration.class) public class DispatcherServletAutoConfiguration { //other code... public static final String DEFAULT_DISPATCHER_SERVLET_BEAN_NAME = "dispatcherServlet"; private String servletPath = "/"; @Bean(name = DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME) @ConditionalOnBean(value = DispatcherServlet.class, name = DEFAULT_DISPATCHER_SERVLET_BEAN_NAME) public ServletRegistrationBean dispatcherServletRegistration( DispatcherServlet dispatcherServlet) { ServletRegistrationBean registration = new ServletRegistrationBean( dispatcherServlet, this.serverProperties.getServletMapping()); //默認攔截 / 所有請求,包括靜態資源,但是不攔截jsp請求;/*會攔截jsp //可以通過修改server.servlet-path來修改默認的攔截請求 registration.setName(DEFAULT_DISPATCHER_SERVLET_BEAN_NAME); registration.setLoadOnStartup( this.webMvcProperties.getServlet().getLoadOnStartup()); if (this.multipartConfig != null) { registration.setMultipartConfig(this.multipartConfig); } return registration; } }
3 其他Servlet容器
Spring boot默認支持Tomcat,Jetty 和Undertow作為底層容器

而Spring boot默認使用Tomcat,一旦引入spring-boot-starter-web模塊,就默認使用Tomcat
切換其其他Servlet容器
將tomcat依賴移除同事引入其他Servlet容易
引入jetty
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<artifactId>spring-boot-starter-tomcat</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
引入undertow
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<artifactId>spring-boot-starter-tomcat</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
參考文章 https://blog.csdn.net/caychen/article/details/80344372
這里對於常見的容器jetty和tomcat做一個簡單對比
jetty 更輕量級,更加靈活,可插拔和可擴展,其架構是基於Handler來實現的,可以同時處理大量長時間連接,默認采用NIO,在處理靜態資源性能較高
Tomcat 默認采用BIO,基於容器設計的,不易擴展,對JavaEE和Servlet的支持更加全面,很多特性直接集成
