spring boot配置Servlet容器

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的支持更加全面,不少特性直接集成

相關文章
相關標籤/搜索