Spring boot 默認使用Tomcat做爲嵌入式Servlet容器,只須要引入spring-boot-start-web依賴,默認採用的Tomcat做爲容器前端
01 定製和修改Servlet容器的相關配置(ServerProperties是EmbeddedServletContainerCustomizer的子類)web
server.port=8080 server.context-path=/ # tomcat相關設置 server.tomcat.uri-encoding=UTF-8
也能夠編寫EmbeddedServletContainerCustomizer(嵌入式的Servlet容器定製器),來修改servlet容器的配置spring
@Bean public EmbeddedServletContainerCustomizer embeddedServletContainerCustomizer(){ //定製嵌入式的Servlet容器相關的屬性配置 return container -> container.setPort(8083); }
2 註冊Servlet容器的三大組件(Servlet Filter Listener)tomcat
spring boot默認採用是以jar包的形式啓動嵌入式的servlet容器,從而啓動Springboot的web應用,沒有web.xml,固然也能夠使用註解的方式(@WebServlet,@WebListener,@WebFilter),如今使用Spring boot做爲框架,若是編寫三大組件,則須要使用配置的方式進行註冊架構
01 ServletRegistrationBean:註冊Servletapp
//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:註冊Listenerjsp
//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自動配置類中進行註冊ide
@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
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的支持更加全面,不少特性直接集成