springMVC源码解析
2021-03-01 11:21:48 3 举报
springMVC最全源码图
作者其他创作
大纲/内容
2
ContentNegotiatingViewResolver
返回mv为null
1
返回ModelAndView
getCandidateViews
3代继承
return 目标方法的返回值
getBestView
继承
返回list
return new ModelAndView();
//调用父类的render
//调用methodinvokeForRequest
解释说明来自哪里?
createInvocableHandlerMethod
FramewokrServlet
lookupHandlerMethod
private final WebMvcConfigurerComposite configurers = new WebMvcConfigurerComposite(); @Autowired(required = false) public void setConfigurers(List<WebMvcConfigurer> configurers) { if (!CollectionUtils.isEmpty(configurers)) { this.configurers.addWebMvcConfigurers(configurers); } }
HandlerMethodReturnValueHandlerComposite
AbstractHandlerExceptionResolver
返回ModerAndView方法:getModelAndView
内部持有15个返回值处理器HandlerMethodReturnValueHandlerComposite
initHandlerMappings
拿到后放入RequestMappingHandlerMapping中
//中置过滤器applyPostHandle
HandlerAdapter
DispatcherServlet
找到被ExceptionHandler标注的类,并且包装好方法的映射关系
new 一个ServletInvocableHandlerMethod并赋值,参数解析器,返回值解析器,这两个解析器是来自RequestMappingHandlerAdapter
//获取跟这个异常匹配的方法resolveMethod
如果返回false 则流程结束
doService
afterPropertiesSet
InvocableHandlerMethod
1作用循环遍历,list中拿出对应方法返回值处理器 足足有15个返回值处理器2来自(this.returnValueHandlers)中的HandlerMethodReturnValueHandlerComposite
//前置过滤器applyPreHandle
processHandlerException
3解释
register
ExceptionHandlerExceptionResolver
当有异常发生
HandlerExecutionChain
this.configurers.addInterceptors(registry);
handleReturnValue
handle
步骤2
springMVC框架的初始化与请求处理
概括:调用了controller 对应的方法,并且方法的返回值,包装到ModerAndViewContainer 中返回
//Controller真正调用handle
resolveException
//AbstractHandlerMethodMappingthis.urlLookup.get(urlPath);
返回ModerAndView
返回View
1 作用:处理返回值,2该类来自:RequestMappingHandlerAdapter类的属性(lthis.returnValueHandlers)3该方法的入参第二个参数 new 了一个ReturnValueMethodParameter
doDispatch
HandlerMethod
resolveViewName
封装HandlerMethod 与requestgetHandlerExecutionChain
initHandlerMethods
//后置过滤器triggerAfterCompletion
AbstractHandlerMethodMapping
空方法钩子调用到子类的addInterceptors(registry);
返回HandlerMethod和过滤器链的包装类
//获取跟HandlerMethod匹配的HandlerAdapter对象
//Controller方法调用,重点看看invokeHandlerMethod
onRefresh
HandlerExceptionResolverComposite
//渲染视图render
InternalResourcesView
doGet
如果发生异常cath Exception{dispatchException=ex}
注意看new RequestResponseBodyMethodProcessor (getMessageConverters()) 就是把AppConfig 配置类中自己配置的StringHttpMessageConverters 赋值到此返回值处理器中,记得这个类就是@ResponseBody的返回值乱码的哪个类,看笔记:《HttpMessageConverter怎么选择的》
ServletInvocableHandlerMethod
@Bean\tpublic RequestMappingHandlerMapping requestMappingHandlerMapping() {\t\tRequestMappingHandlerMapping mapping = createRequestMappingHandlerMapping();\t\tmapping.setOrder(0);\t\tmapping.setInterceptors(getInterceptors());
AbstractHandlerMapping
ServletInvocableHandlerMethod持有一个成员变量是this.returnValueHandlers方法:handleReturnValue 目的处理方法的返回值
resolver = new ExceptionHandlerMethodResolver(handlerType);
1解释
诡异 urlLookup什么时候赋值的???思维引导:这是请求的url 对应的要调用Controller下方法的映射,此映射规则在springMVC 在初始化时建立最为合适因为AbstractHandlerMethodMapping 实现了InitializingBean
解释
返回view
handleInternal
3
ServletInvocableHandlerMethod是HandlerMethod 接口类型:1HandlerMethod 包装了要调用类的实例,与对应异常 要映射那个方法methodfont color=\"#3333ff\
AbstractCachingViewResolver
同一个
renderMergedOutputModel
用了很多@Bean的方式新建了很多bean:例如:RequestMappingHandlerAdapterBeanNameUrlHandlerMappingRequestMappingHandlerMappingContentNegotiationManager
initStrategies
initHandlerMapping逻辑是:先从spring容器中找名字为handlerMapping,如果没有从DispatcherServlet.properties 中找,这是在DispatcherServlet 的代码块中进行加载properties文件的
AbstractHandlerMethodExceptionResolver
目的给handlerMapping赋值
processRequest
循环遍历HandlerMapping
getHandler
service
onApplicationEvent
这边解析了完整的视图名字,暂时还没看懂,以后看
getExceptionHandlerMethod
//此处同上:1调用controller 2处理返回值invokeAndHandle
返回HandlerMethodReturnValueHandler
this.mappingRegistry.getMappingsByUrl(lookupPath);//继续进入getMappingByUrl
registerHandlerMethod
钩子钩子类doGet
先拿出视图逻辑名字,然后判断当前逻辑名字前缀是否有\"redierct:\
addInterceptors(registry);
addInterceptors(registry);
ViewResolverComposite
父类
解释supportReturnType
@Bean\tpublic RequestMappingHandlerMapping requestMappingHandlerMapping() {\t\tRequestMappingHandlerMapping mapping = createRequestMappingHandlerMapping();\t\tmapping.setOrder(0);\t\tmapping.setInterceptors(getInterceptors());\t\tmapping.setContentNegotiationManager(mvcContentNegotiationManager());\t\tmapping.setCorsConfigurations(getCorsConfigurations());
不仅初始化返回值的处理器,还初始化参数解析器
//获取这个异常匹配的方法resolveMethodByThrowable
解释来自哪里
getInterceptors()
返回的视图url 为 /jsp/ok_null.jsp 这不在时一个单纯的逻辑视图名字。
返回了一个ServletInvocableHandlerMethod
HttpServlet
view
doResolveException
processCandidateBean
getHandlerInternal
//渲染视图processDispatchResult
@EnableWebMvc
FrameworkServlet
步骤1情况1
@Import(DelegatingWebMvcConfiguration.class)
AbstractHandlerMethodMapping内部的类MappingRegistry
返回HandlerMethod
处理异常解析视图,与处理正常视图解析,类似,都是一个结尾为Composite的类,并且类中都持有一个list属性,装的是解析器,而解析器来自@EnableMvc引入类的父类@Bean 方法生成的
返回值
第三条引申出来的看
@Configuration@EnableWebMvcpublic class AppConfig extends WebMvcConfigurerAdapter {
RequestMappingHandlerAdapter
AbstractView
WebMvcConfigurationSupport
这么多处理器在哪里初始化的
selectHandler
ViewNameMethodReturnValueHandler
getHandlerAdapter
2解释
WebMvcConfigurerComposite
遍历map:this.esceptionHandlerAdviceCache//当前类的实现 了nitializeringBean 接口初始化key是被标注了@ContorllerAdvice的类,value 是对应的ExceptionHandlerMethodResolverfont color=\"#3333ff\
看setInterceptors();
//具体调用逻辑invokeAndHandle
之所以有9个,与上方15个不同,那是因为,这里9个处理器来自ExceptioinHandlerExceptionResolver类中doResolverHandlerMethodException 方法中对ServletInvocationHandlerMethod 类进行初始化了,参数解析器与返回值解析器
策略模式,大约26种解析参数的类,具体用那个类解析哪种参数,用for循环
选择处理返回值的处理器,有9个!!selectHandler
类:DelegatingWebMvcConfiguration
//反射抵用目标方法doInvoke
//类RequestMappingHandlerMapping类的4代父类AbstractHandlerMapping public void setInterceptors(Object... interceptors) { this.interceptors.addAll(Arrays.asList(interceptors)); }拦截器存入了ths.interceptors中
detectHandlerMethods
HandlerMethodReturnValueHandler
//目标controller内方法调用逻辑invokeForRequest
1 supportReturnType 方法的入参,来自HandlerMethodReturnValueHandlerComposite类的方法handlerReturnValue的第二个方法入参是font color=\"#3333ff\
AbstractHandlerMethodAdapter
render
doResolveHandlerMethodException
当前controller 返回一个字符串 \"ok\
无异常,步骤1情况2
4最后一行返回了一个HandlerMethod
InternalResourceViewResolver
0 条评论
回复 删除
下一页