1.前言

   算一算自己看springMVC流程图的总次数,没有20次也有10次了,总是看了忘,忘了看,不得其要领,好不痛快!  如今就趁着机会把及再理解一遍,再不行我感觉自己可以放弃技术这条路了,不适合自己。

2.时序图

   我的前老大说过,画图比你写文字强得多。  不过我还是觉得,有些适合画图理解,有些还是得文字理解更好(比如算法,数据结构类的问题)。但显然,这个问题画图更好。

   图是照着网上资源依葫芦画瓢画的,根本区别在于,我是一边画,一边在跟着源码走,这点尤其重要。

springmvc流程理解_跨域

3.HandlerMapping大致类结构:

springmvc流程理解_跨域_02

   说明:

         1. 这里并未完全包含子类结构(如SimpleUrlHandlerMapping及其相关的类),也不是特别严谨,仅作个人理解参考。

 HandlerExecutionChain,可理解为对Handler的一个包装,由一个Handler 及 多个 Inteceptor组成。如下图示:

springmvc流程理解_子类_03

万万不可被该名字给误导

.HandlerMapping 与 HandlerAdapter 实际是通过 Handler 作为中介而联系起来的。 哎, 真相总是这么质朴无华。

handler只是一个抽象概念,它的类型为Object. 这也是为什么需要Adapter的根本原因。

4.HandlerAdapter的理解:

springmvc流程理解_子类_04

说明:

        1.HandlerAdappter以上述五种基本的Handler(抽象)为基本点进行代码支持,其中,HandlerFunction是spring5.2才具有的0

       2.Servlet本身可以充当Handler,调用的是其 service方法不支持ModelAndView的视图渲染;

          图中的Controller是一个接口,非注解,它提供对HandlerMethod的简易支持支持ModelAndView视图渲染;

          HttpRequest类似http流程的支持,典型用例: 跨域的Options头进行preLight检查;

          HandlerFunction提供webFlux支持,支持ModelAndView视图渲染;

RequestMappingHandlerAdapter,它提供对HandlerMethod的高级支持。我们最常用的应该就是它,我们想要的答案,(比如:参数绑定,参数解析,返回值处理。 注:跨域处理,多线程处理 是每个Handler都要处理的问题)也能从它身上进行寻找。  同时,它本身也包含很多的配置项。

       3. 它的核心执行流程逻辑,在基于spirng的web开发中,这个几乎就是它的骨架了。简略截图如下:

springmvc流程理解_spring_05

springmvc流程理解_子类_06

springmvc流程理解_跨域_07

   

springmvc流程理解_子类_08

5.MappingRegistry如何生效

    这一环也是无比的重要。因为它提供了映射的来源,才能够继续进行之后的流程。

扫描上下文中的所有非代理对象,且含有@ReqestMapping或@Controller及其子类注解的bean,然后安装特定规则保存至ConcurrentHashMap(经查,是HashMap,在使用的时候加读写锁来保证线程安全)

  其核心代码如下(起点为:AbstractHandlerMethodMapping的afterPropertiesSet方法),

     

springmvc流程理解_spring_09

springmvc流程理解_子类_10

springmvc流程理解_spring_11

springmvc流程理解_子类_12

springmvc流程理解_spring_13

springmvc流程理解_跨域_14

6.提供优雅模块化服务接口:

   第一种方式,响应式编程(来自博客:​​Spring Boot RouterFunction​​):

springmvc流程理解_spring_15

   优点:优雅,优雅,还是优雅!

   缺点:不能向下兼容,且spring5.2版本太新,移植性差;

第二种方式,以bean的方式提供注入(来自博客:​​spring boot通过@Bean注解定义一个Controller​​)

springmvc流程理解_子类_16

  以上两种方法均未经过我的验证,但是理论上是没有问题的。 可能实际操作起来有些小的变化,随机而动吧。