今天来带大家跟一下Springmvc源码:
在此之前先来回顾一下Springmvc 的三种实现方式:
- 实现HttpRequestHandler接口
- 实现Controller接口
- annotation(通过@Controller/@RestController注解)
这三种的上两种都需要配置在配置文件里配置bean。
(有的人想问了,上面这些跟流程有什么关系,一会你就发现上面这些很重要)
- 首先 我们都知道一个SpringMvc有一个最重要的类DispatcherServlet(前端控制器);
- 先项目启动后,会先调用FrameworkServlet的service() ——> processRequest()——>doService();
- 当调用doService方法时,发现这个方法是一个抽象方法,谁实现了它呢?当然就是DispatcherServlet ,此时我们顺利的走到了前端控制器。
- doService又调用了doDispatch() ; 这个方法里就发生了最重要的流程。
- mappedHandler = getHandler(processedRequest); getHandler里面循环判断这个控制器怎么配置的(是通过xml配置还是annotation),然后返回的就是HandlerExecutionChain的对象。(一个mappedHandler和一个过滤器)
- HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler()); 这个方法里就是看控制器怎么实现的(上边三种方式)。
- mv = ha.handle(processedRequest, response, mappedHandler.getHandler());这个方法里,看ha的实现方式,如果是实现Controller,那么返回值强转成Controller;如果是实现HttpRequestHandler那么强转成HttpRequestHandler;如果是annotation,那么通过获取类信息,注解等,返回对应的modelAndView。