SpringMVC-请求流程源码剖析
2022-10-24 15:36:07 0 举报
SpringMVC-请求流程源码剖析
作者其他创作
大纲/内容
是否useSuffixPatternMatch(任意后缀,如果为true:/user.* 匹配/user)
循环methods ,进行注册#AbstractHandlerMethodMapping.MappingRegistry#register
进行解析出RequestMappingInfo#获取RequestMapping注解#RequestMappingHandlerMapping#getMappingForMethod
AbstractHandlerMapping#getHandler
11、将Model中的数据填充到View视图中渲染视图
6、执行处理器中的方法
多个
1.主要作用是根据当前url匹配到Handler方法2.映射信息在容器启动时Bean初始化时进行初始化3.最简单的方式是直接匹配URL=path 如果没有匹配到会通过通配符进行匹配? * ** {}4.返回的handlerMethod最终会和拦截器一起封装到chain中
为空
9、视图解析
把最匹配的设置到request中,返回HandlerMethod
如果可以根据url来匹配到mappings
从request中解析出请求映射路径
8、返回ModelAndView对象
this.mappingRegistry.getMappingsByDirectPath(lookupPath);
AbstractHandlerMethodMapping#addMatchingMappings
进行排序找到最精准的那个,通过AntPatternComparator#compare大概是这样的: ? > * > {} >**
用所有的RequestMappingInfo 通过AntPathMatcher匹配
浏览器(请求)
解析类AbstractHandlerMethodMapping#detectHandlerMethods
HandlerExecutionChainHandlerInterceptorHandler
从pathLookup拿到RequestMappingInfo
存在所有的mapping
最重要就是把前缀+试图名+后缀封装成view
HttpMessageConverter
去拿默认配置的defaultHandler
如果有@ResponseBody
返回HandlerExecutionChain
找到合适的HandlerAdapter
1、请求
AbstractHandlerMethodMapping#getHandlerInternal
RequestMappingHandlerMapping#afterPropertiesSet
视图
2、通过处理器映射器找到合适的处理器
No
MappingJackson2HttpMessageConverter#解析JSON
3、返回处理器执行链
AbstractHandlerMapping#getHandlerExecutionChain
调用前置拦截器
Bean的初始化阶段:InitializingBean#afterPropertiesSet
HandlerMapping#getHandler处理器映射器
如果方法上面有@RequestMapping:解析出RequestMappingInfo
是否存在相同路径映射validateMethodMapping
用pathLookup拿到的RequestMappingInfo,则用该mapping进行匹配其他条件(method、header等)
new HandlerExecutionChain(handler)
<mvc:annotation-driven>WebMvcConfigurationSupport自动导入该bean
useTrailingSlashMatch(尾斜杠,如果为true: /user/ 匹配/user)
AbstractHandlerMethodMapping#initHandlerMethods
AntPathMatcher#match通配符地址匹配* {} ? **
AbstractHandlerMethodMapping#processCandidateBean
ViewResolver视图解析器
判断是否有@Controller或者@RequestMapping
循环所有HandlerMapping只要有一个找到匹配就返回HandlerExecutionChain
DispatcherServlet#getHandler
拿到handlerMappings(初始化的时候找到所有实现HandlerMapping的类)
指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回
请求中的params 指定request中必须包含某些参数值是,才让该方法处理。
指定request中必须包含某些指定的header值,才能让该方法处理请求。
拿到最精准那个
5、调用处理器适配器执行handler
匹配到几个
循环处理候选bean——即解析@RequestMapping和映射路径
initLookupPath(request);
根据url来匹配RequestMapping
封装目标对象,方法HandlerMethod
Handler处理器Controller
@RequestMapping的解析过程
获取RequestMethod方法 RequestMethod枚举类型(GET、POST、PUT、DELETE)
@RequestMapping请求映射 返回HandlerExecutionChain
处理返回值
4
给所有的处理链上添加所有的拦截器MappedInterceptor
patternsCondition.getMatchingCondition
解析参数
1、将model解析到request中的attribute中2、直接通过servlet api转发业务renderMergedOutputModel
如果方法上面有@RequestMapping,看看类上面是不是有@RequestMapping
类上面也有@RequestMapping 那就合并比如 类:/user 方法:/info 合并为 /user/info
mapping.getHandler(request)
DispatcherServlet#doDispatch前端控制器
抛错,404
HandlerAdapter处理器适配器
12、返回响应
请求url是否等于@RequestMapping的path
7、返回ModelAndView对象
拿到容器的所有bean
10、返回View对象
0 条评论
回复 删除
下一页