Spring boot 梳理 - Spring boot自动注册DispatcherServlet

  1. spring boot提供的DispatcherServlet的name就是“dispatcherServlet”。
    1. 源码
        public ServletRegistrationBean dispatcherServletRegistration(DispatcherServlet dispatcherServlet) {
          ServletRegistrationBean registration = new ServletRegistrationBean(dispatcherServlet, new String[]{this.serverProperties.getServletMapping()});
          registration.setName("dispatcherServlet");
          registration.setLoadOnStartup(this.webMvcProperties.getServlet().getLoadOnStartup());
          if(this.multipartConfig != null) {
            registration.setMultipartConfig(this.multipartConfig);
          }
       
          return registration;
        }
      }

       

    • 首先,DispatcherServlet被作为一个普通Bean被定义和注册到容器;
    • 然后,又定义了另外一个ServletRegistrationBean bean用来添加该DispatcherServlet bean到ServletContext;
  2. spring boot中注册Servlet的两种方式
    1. 1.@WebServlet注解:

      这个是javaee的注解,是servlet3.0以后提供的。spring boot会扫描这个注解,并将这个注解注解的类注册到web容器中作为一个servlet。

      但是DispatcherServlet并不是自定义的servlet,而是框架提供的servlet,所以此方法不行。

      2.ServletRegistrationBean:

      这个bean是由spring boot提供专门来注册servlet的,可以象注册bean一样去配置servlet。

    2. @Bean
      public ServletRegistrationBean restServlet(){
        //注解扫描上下文
        AnnotationConfigWebApplicationContext applicationContext
            = new AnnotationConfigWebApplicationContext();
        //base package
        applicationContext.scan("com.jerryl.rest");
        //通过构造函数指定dispatcherServlet的上下文
        DispatcherServlet rest_dispatcherServlet
            = new DispatcherServlet(applicationContext);
       
        //用ServletRegistrationBean包装servlet
        ServletRegistrationBean registrationBean
            = new ServletRegistrationBean(rest_dispatcherServlet);
        registrationBean.setLoadOnStartup(1);
        //指定urlmapping
        registrationBean.addUrlMappings("/rest/*");
        //指定name,如果不指定默认为dispatcherServlet
        registrationBean.setName("rest");
        return registrationBean;
      }

       

    3. 其中需要注意的是registration.setName("rest"),这个语句很重要,因为name相同的ServletRegistrationBean只有一个会生效,也就是说,后注册的会覆盖掉name相同的ServletRegistrationBean。

      如果不指定,默认为“dispatcherServlet”而spring boot提供的DispatcherServlet的name就是“dispatcherServlet”。可以在spring boot的DispatcherServletAutoConfiguration类中找到

    4. 所以为了不覆盖默认的dispatcherServlet,必须指定一个别的名称

posted on 2018-12-27 22:53  手握太阳  阅读(4801)  评论(0编辑  收藏  举报

导航