zoukankan      html  css  js  c++  java
  • 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,必须指定一个别的名称
  • 相关阅读:
    iPhone X 的“刘海”正是苹果的品牌象征
    中国首届原型设计大赛在成都举办
    hdu1114Piggy-Bank(完全背包)
    hdu2602Bone Collector(01背包)
    漏洞百出的线段树!!
    hdu1078FatMouse and Cheese
    hdu2859Phalanx
    poj3186Treats for the Cows(区间dp)
    uva10088格点多边形
    快速幂快速乘
  • 原文地址:https://www.cnblogs.com/jiangtao1218/p/10188016.html
Copyright © 2011-2022 走看看