美文网首页
spring-webmvc

spring-webmvc

作者: 码农崛起 | 来源:发表于2018-05-09 11:58 被阅读0次

    1, 初始化
    1.1 web.xml
    基于web.xml,通过ContextLoaderListener在servlet容器启动时初始化WebApplicationContext,然后放入ServletContext的WebApplicationContext.class.getName() + ".ROOT"属性中。

    1.2, 基于注解
    servlet 3.1 规范 8.2.4节
    The ServletContainerInitializer class is looked up via the jar services API. For each application, an instance of the ServletContainerInitializer is created by the container at application startup time. The framework providing an implementation of the ServletContainerInitializer MUST bundle in the META-INF/services directory of the jar file a file called javax.servlet.ServletContainerInitializer, as per the jar services API, that points to the implementation class of the ServletContainerInitializer.
    In addition to the ServletContainerInitializer we also have an annotation - HandlesTypes. The HandlesTypes annotation on the implementation of the ServletContainerInitializer is used to express interest in classes that may have annotations (type, method or field level annotations) specified in the value of the HandlesTypes or if it extends / implements one those classes anywhere in the class’ super types. The HandlesTypes annotation is applied irrespective of the setting of metadata-complete.

    servlet容器在加载web应用时,会查找META-INF/services文件夹下文件名为javax.servlet.ServletContainerInitializer的文件的内容,文件内容为ServletContainerInitializer的实现类。HandlesTypes注解指定的类型的所有类会传递给ServletContainerInitializer#onStartup

    SpringServletContainerInitializer.png AbstractContextLoaderInitializer.png

    2 , ContextLoaderListener

    initWebApplicationContext.png configureAndRefreshWebApplicationContext.png

    3, DispatcherServlet
    3.1 初始化

    策略接口.png initStrategies.png initHandlerMappings.png getDefaultStrategies.png DispatcherServlet.properties

    根据配置,初始化各个策略接口。

    3.2 doService

    doService.png

    把FlashMap,WebApplicationContext等放入request

    doDispatch.png

    doDispatch处理流程
    3.2.1 检查是否文件上传

    checkMultipart.png

    3.2.2 根据handlerMappings和请求获取HandlerExecutionChain

    getHandler.png

    从DispatcherServlet.properties可以看出HandlerMapping实现类为BeanNameUrlHandlerMapping和RequestMappingHandlerMapping

    AbstractHandlerMapping

    getHandler.png getHandlerExecutionChain.png

    抽象模版设计模式:根据请求获取handler,加入拦截器链。

    BeanNameUrlHandlerMapping的实现机制是根据/开头的bean别名匹配请求

    determineUrlsForHandler.png detectHandlers.png registerHandler.png lookupHandler.png

    RequestMappingHandlerMapping的实现机制是检查BeanFactory中所有bean中RequestMapping注解的方法,加入MappingRegistry注册表

    AbstractHandlerMethodMapping.png regist.png getMappingForMethod.png

    ![createRequestMappingInfo.io/upload_images/11548923-fb373da124807a4f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

    查找MappingRegistry注册表

    lookupHandlerMethod.png

    3.2.3 获取handler之后,查找与之匹配的HandlerAdapter,由HandlerAdapter来处理各种handler,统一返回ModelAndView。

    DispatcherServlet.properties中HandlerAdapter的子类为HttpRequestHandlerAdapter,SimpleControllerHandlerAdapter,RequestMappingHandlerAdapter

    HttpRequestHandlerAdapter处理HttpRequestHandler,不返回ModelAndView,自己返回响应信息

    HttpRequestHandlerAdapter.png

    SimpleControllerHandlerAdapter处理实现Controller接口的handler

    SimpleControllerHandlerAdapter.png

    RequestMappingHandlerAdapter处理HandlerMethod,根据注册的HandlerMethodReturnValueHandler处理handler返回值。

    AbstractHandlerMethodAdapter.png supportsInternal.png invokeHandlerMethod.png invokeAndHandle.png handleReturnValue.png 注册HandlerMethodReturnValueHandler.png getDefaultReturnValueHandlers.png

    handler返回异步结果时才会异步处理!!!

    AsyncTaskMethodReturnValueHandler.png

    spring-mvc请求处理流程,很多细节还需要完善!!!

    相关文章

      网友评论

          本文标题:spring-webmvc

          本文链接:https://www.haomeiwen.com/subject/zgvplftx.html