SpringMVC源码浅析
核心组件:DispatcherServlet、HandlerMapping、HandlerAdapter、ModelAndView
DispatcherServlet负责请求的分发(doDispatch
)。
1 | // DispatcherServlet 继承层级关系 |
DispatchServlet中getHandler 方法浅析
1 | // private List<HandlerMapping> handlerMappings; |
1 |
|
1 |
|
1 | class MappingRegistry { |
RequestMappingHandlerMapping 继承了AbstractHandlerMapping和AbstractHandlerMethodMapping,AbstractHandlerMethodMapping中包含一个private final MappingRegistry mappingRegistry = new MappingRegistry();
对象,该对象又包含一个private final Map<T, MappingRegistration<T>> registry = new HashMap<>();
,注意到这个hashmap的value类型是MappingRegistration
,内有private final HandlerMethod handlerMethod;
这个handlerMethod就是保存了到底哪个控制器、控制器的哪个方法用来处理请求这样的具体信息(在ioc容器初始化时就完成扫描和初始化)。DispatcherServlet通过getHandler方法得到一个具体的HandlerExecutionChain,该对象内包含:
1 | private final Object handler; |
通过debug之后发现,handler最终是HandlerMethod类型的;另外内还有一系列的拦截器组成的list。
通过getAdpater
方法,将HandlerExecutionChain
中的handler传入,返回HandlerAdapter,之后执行对应控制器中的具体方法(handle
方法运用Java的 反射机制执行controller的具体方法)将返回结果包装在ModelAndView中。
HandlerAdapter的具体子类:
1 | SimpleControllerHandlerAdapter |
HandlerMapping的作用:
找到能处理请求的handler(具体某个Controller中的方法,封装到HandlerMethod中)
HandlerAdapter的作用:
将与请求对应的handler封装到支持handler的adapter中,同时定义了如何处理请求的策略,通过请求url、请求Method和处理器的requestMapping定义,最终确定使用handler类的哪个方法来处理请求,并检查处理类相应处理方法的参数以及相关的Annotation配置,确定如何转换需要的参数传入调用方法,并最终利用反射的方式执行具体处理请求的方法,返回ModelAndView。
拦截器的执行时机: