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.png2 , ContextLoaderListener
initWebApplicationContext.png configureAndRefreshWebApplicationContext.png3, DispatcherServlet
3.1 初始化
根据配置,初始化各个策略接口。
3.2 doService
doService.png把FlashMap,WebApplicationContext等放入request
doDispatch.pngdoDispatch处理流程
3.2.1 检查是否文件上传
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.pngRequestMappingHandlerMapping的实现机制是检查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.png3.2.3 获取handler之后,查找与之匹配的HandlerAdapter,由HandlerAdapter来处理各种handler,统一返回ModelAndView。
DispatcherServlet.properties中HandlerAdapter的子类为HttpRequestHandlerAdapter,SimpleControllerHandlerAdapter,RequestMappingHandlerAdapter
HttpRequestHandlerAdapter处理HttpRequestHandler,不返回ModelAndView,自己返回响应信息
HttpRequestHandlerAdapter.pngSimpleControllerHandlerAdapter处理实现Controller接口的handler
SimpleControllerHandlerAdapter.pngRequestMappingHandlerAdapter处理HandlerMethod,根据注册的HandlerMethodReturnValueHandler处理handler返回值。
AbstractHandlerMethodAdapter.png supportsInternal.png invokeHandlerMethod.png invokeAndHandle.png handleReturnValue.png 注册HandlerMethodReturnValueHandler.png getDefaultReturnValueHandlers.pnghandler返回异步结果时才会异步处理!!!
AsyncTaskMethodReturnValueHandler.pngspring-mvc请求处理流程,很多细节还需要完善!!!