SpringMVC执行流程原理及源码解读

1.SpringMVC执行流程

        用户发出请求到前端控制器,前端控制器请求查找Handler,处理器映射器找到Handler后返回一个执行链到前端控制器,再继续请求适配器执行Handler,经过适配器后在Handler处理器中处理业务,也就是常见的Controller,最终返回ModelAndView一直到前端控制器,前端控制器请求视图解析器解析ModelAndView为View,再次返回到前端处理器,最终完成渲染工作。

2.SpringMVC在三层架构中的位置

        开发架构一般都是基于两种形式。一种是C/S架构,也就是客户端/服务器。另一种是 B/S架构,也就是浏览器/服务器。在 JavaEE 开发中,几乎全都是基于 B/S 架构的开发。在 B/S 架构中,系统标准的三层架构包括:表现层、业务层、持久层。

3.SpringMVC源码解读

1.前端控制器DispatcherServlet接收到请求后,会执行init方法(HttpServletBean中重写了HttpServlet中的init方法)。

2.init方法干了什么?

实际上DispatcherServlet中有一个spring容器,这个容器就是init方法创建的,创建时会扫描WEBINF目录下的web.xml读取配置信息。

3.容器创建完成之后发布一个event,然后会有一个监听器接收到event从而执行initStrategies方法,这个方法里面会初始化处理器、适配器等等。

3.1.在HandlerMapping中读取了默认的properties文件,然后创建了RequestMappingHandlerMapping,再Bean.afterPropertiesSet(),方法内找到有哪些类加了Controller或RequestMapping注解。

所以直接这么写也是可以访问的。

3.1.1.找到Controller之后,就判断类里面有哪些方法加了RequestMapping注解,并且解析注解里面的内容。最后把解析的内容和方法放到map中执行mappingRegistry保存起来。

3.2.除了创建第四步中的bean之外,还创建了BeanNameUrlHandlerMapping,执行bean.initApplicationContext()--> /test Bean对象。

3.3 RequestMappingHandlerAdapter.afterPropertiesSet() 找的是@ControllerAdvice注解的类。

还能找到一些其他注解的方法,逻辑都类似@InitBinder @ModelAttribute。包括实现 了某些接口的信息都会被记录(如实现了ResponseBodyAdvice接口的类,可以在设置响应体之前做一些事)。

4.处理请求

4.1父子容器

web.xml中的listener就是父容器,并且指定它的配置文件。(tomcat优先解析listener节点)

如果当前容器找不到某个bean就会去父容器中找。(使用场景很少)

4.2执行流程如下

DispatcherServlet-->接受请求-->path,request parameters -->path-->@Requestmapping method-->解析参数,参数绑定-->执行方法-->返回值解析

4.3处理器映射器HandlerMapping找Handler

根据请求,执行service方法(在父类framework中),最终都会到DispatcherServlet内的doServcie方法内,在doService()方法中先把localeResolver、themeResolver(国际化解析器,主题解析器)等等以及上下文等放入request的属性中,方便后面有需要的人进行使用。最后调用doDispatch()方法从HandlerMapping集合中获取HandlerExecutionChain

默认存了properties中的三个handlerMapping,遍历寻找handler

Object handler既可以表示一个Bean,也可以表示某个要执行的方法。

找到handler后返回的是一个执行链,执行链中也包括了handler。

4.4HandlerAdapter

实际上也是遍历adapters,和4.3类似,下图为properties文件的默认四种处理器适配器

最后让匹配的处理器适配器执行方法,执行之前会先执行拦截器。最后返回的是ModelAndVeiw

适配器可以理解为调用具体方法的那个对象。

5.解析视图,渲染页面

  • 15
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值