• Spring boot 梳理


    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,必须指定一个别的名称
  • 相关阅读:
    Mybatis动态SQL
    自己动手写一个持久层框架
    最长公共子串算法(Longest Common Substring)
    【SpringCloud】08.客户端负载均衡器:Ribbon
    ESP32 (idf-esp-v4.1)重新生成nvs分区
    IDEA导入新的springboot项目出错
    springboot集成mybatis出现问题/连接数据库出错
    Java学习周记2
    2020.8.6_Java学习日记
    9.23笔试总结
  • 原文地址:https://www.cnblogs.com/jiangtao1218/p/10188016.html
Copyright © 2020-2023  润新知