spring-webmvc

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)