spring-web项目不用配置web.xml的方式原理

springmvc时的入口

比较早之前使用springmvc的时候,都要配置个web.xml文件.并且在文件写个servlet的标签,如下:

   <!-- 配置Spring的前置控制器DispatcherServlet --> 
  <servlet>
        <servlet-name>spring</servlet-name>
            <servlet-class>
                org.springframework.web.servlet.DispatcherServlet
            </servlet-class>
        <load-on-startup>1</load-on-startup>
   </servlet>
   <!-- 配置Spring的url后缀 --> 
   <servlet-mapping>
        <servlet-name>spring</servlet-name>
        <url-pattern>*.do</url-pattern>
   </servlet-mapping>
</web-app>

为什么这样写Tomcat就可以扫描到呢?
因为:servlet的规范约束而成的,Tomcat和java都可以认为遵守这个规范,.所以Tomcat开发的时候,会根据规范走,当我们启动Tomcat的时候Tomcat会去扫描自己webapps目录下的web.xml文件,且加载如上面配置的DispatcherServlet类,这个类是实现了servlet接口,所以初始化的时候会调用其init的方法,
然后接下来就是springmvc初始化逻辑主要就是

protected void initStrategies(ApplicationContext context) {
     
    initMultipartResolver(context);
    initLocaleResolver(context);
    initThemeResolver(context);
    initHandlerMappings(context);
    initHandlerAdapters(context);
    initHandlerExceptionResolvers(context);
    initRequestToViewNameTranslator(context);
    initViewResolvers(context);
    initFlashMapManager(context);
}

从spring容器中初始化:
初始化requestmapping对象,默认有两种(其实就是我们controller层实现方式两大类型);把url和对应的处理方法放到map中;
初始化HandlerAdapter(找到对应的requestmaping得到具体的handler后会调用对应的适配进行)
初始化argumentresolver方法参数解析器对象(调用的方法的参数解析确认最终执行方法);
初始化ViewResolvers视图解析器(方法执行后,根据不同的返回类型判断是否重定向还是返回页面或者还是json输出)
后期在我们调用的时候根据调用的web.xml配置的

   <servlet-mapping>
        <servlet-name>spring</servlet-name>
        <url-pattern>*.do</url-pattern>
   </servlet-mapping>

url进行拦截,然后按springmvc上面的介绍初始化的时候的几大组件

spring高版本(基于servlet3.0以上)

servlet3.0规范一个spi机制;达到零配置的目的
Tomcat高版本中初始化的时候会扫描项目中在
在META-INF/services/目录下定义了如下文件:
java.servlet.ServletContainerInitializer
这个文件内部写了一个这个接口的实现类
spring-web的jar定义了一个具体的实现类,SpringServletContainerInitializer这个类
通过源码发现,配合注解@HandlesTypes它可以将其指定的Class对象作为参数传递到onStartup方法中。进而在onStartup方法中获取Class对象的具体实现类,进而调用实现类中的具体方法。SpringServletContainerInitializer类中@HandlesTypes指定的是Class对象是WebApplicationInitializer.Class。
所以Tomcat初始化的时候会调用onStartup方法然后在这里面进行springmvc的初始化就完成了;
利用这个机制,若实现WebApplicationInitializer这个接口,我们就可以自定义的注入Servlet,或者Filter,即可以不再依赖web.xml的配置。

你可能感兴趣的:(servlet3.0)