一个Http请求,大致分为请求->响应过程,其中SpringMvc框架接受请求,处理一系列事情后响应给客户端。
大家都知道,Tomcat启动监听读取web.xml配置文件,其中servlet配置<load-on-startup>1</load-on-startup> 随服务启动而自动加载org.springframework.web.servlet.DispatcherServlet。
DispatcherServlet是个关键,没有它就没有SpringMvc应用。它里面包含很多,其中关键点有个HandlerMapping,它是个接口。负责的是@RequestMapping,请求路由处理器。
首先先来了解下annotation-driven 注解驱动
1. <mvc:annotation-driven/>
annotation-driven 注解驱动 在xml中肯定有,那为啥要写,有啥关联?
其实就是帮我们注册了DefaultAnnotationHandlerMapping 和 AnnotationMethodHandlerAdapter (可能这2个已经过时了,不过没关系,知道原理就行)
过时现在最新对应的是RequestMappingHandlerMapping 和 RequestMappingHandlerAdapter ,这更好理解。
RequestMappingHandlerMapping :看源代码肯定是实现了HandlerMapping接口,它会处理@RequestMapping 注解,并将其注册到请求映射表中
。。。。
继承很多
RequestMappingHandlerAdapter:看源代码肯定是实现了HandlerAdapter接口,则是处理请求的适配器,确定调用哪个类的哪个方法,并且构造方法参数,返回值。说白了就是依赖注入处理,
扫描到的@Component,@Controller,@Service,@Repository等注解标记的组件注册到工厂中,来处理我们的请求。
总结:
1、说白了注解驱动就干了2件很关键的事情,一个是路由匹配,另一个是注解依赖注入。
2、结合DispatcherServlet 来看,就是DispatcherServlet 中有一个HandlerMapping接口,annotation-driven去实现它,然后Tomcat 服务启动后自动加载annotation-driven 中的2个bean
Spring MVC 框架主要由 DispatcherServlet、处理器映射、控制器、视图解析器、视图组成,其工作原理如图 1 所示
从图 1 可总结出 Spring MVC 的工作流程如下:
- 客户端请求提交到 DispatcherServlet。
- 由 DispatcherServlet 控制器寻找一个或多个 HandlerMapping,找到处理请求的 Controller。
- DispatcherServlet 将请求提交到 Controller。
- Controller 调用业务逻辑处理后返回 ModelAndView。
- DispatcherServlet 寻找一个或多个 ViewResolver 视图解析器,找到 ModelAndView 指定的视图。
- 视图负责将结果显示到客户端。
再看一张流程图,上下2张结合看,更清楚。