SpringMvc 源码解析

图1

首先加入 spring——webmvc依赖。

图2

首先我们要明白一个请求的过程。一个request 请求 首先经过一个 servlet 。然后同反射获取类名和方法名,调用controller类的对应方法。

图3

图4

 

setLonadOnStartup(1) 的作用是回执行DispatcherServlet的init()方法。

图5

 图6

这个是tomcat启动的时候调用的过程。不好分析代码。我们从页面调用一下controller来跟踪。

图7

这个是DispatchServlet的类图。

图8

图9

通过调用链,我们能够看首先调用的是FrameworkServlet的service 方法,然后调用HttpServlet的service方法,调用FrameworkServlet的doGet方法。在调用FrameworkServlet的processRequest方法, 这些都不重要。

这些都是一些变量的赋值不重要。

 

这个是核心方法。

图10

 

 978行推断controller的类型,啥?controller还有类型,都用哪几种类型啊,3种类型。

 如果HandlerExecutionChain是一个bean,appedHandler.getHandler()是一个类,如果是一个方法,appedHandler.getHandler()返回的就是一个方法。现在有问题,如果是一个类的情况,为什么不能也返回一个 handleRequest() 这个一个方法,因为肯定会实现这个方法的啊。 最终把获取的类,或者方法交给HandlerAdapter的适配器去处理。不同的方法交给不同的适配器。这个适配器分为两个大类一个处理url的,另一个是处理bean的。图14

前置拦截器处理。

采用反射调用。

图10-0

 

图10-1

这个是加@Controller注解的;

 

这个两种的实现方法有什么不同呢。 如果是实现Controller接口的方法,回重写hadleRequest方法。我们只需从map1中找到路径 key为luban,对应的value值的IndexController就可以了。直接通过反射调用Controller的hadleRequest方法就可以了,因为这个是固定写死的。

但是我们加@Controller 注解的方式,不实现Controller接口。这样我们就不能固定找到对应的方法了。因为方法会变的。首先spring根据路径localhost:9090/index  ,从map1中找对应index的key ,从map1中找不到,然后再从map2中找到找到了index对应的方法,index1,利用反射调用这个index1()方法。 spirng 中map1和map2 是用HanderMapping 子类来实现的。

 

图10-2

图11

BeanNameUrlHandlerMapping 顾名思义就是和我们类的名称有关对应的是我们上面说的map1。 下面的RequestMappingHandlerMapping 与我们的请求路径有关相当于与上面的map2。当我们是使用第二种方式的时候,加了@Controller注解方式的时候,当遍历haderMappings时,BeanNameUrlHandlerMapping 应该为null值,继续遍历requestMappingHandlerMapping应该有两个两个值,一个是key为index,value为index;一个是key是index2,value是index2的值,

图12

 

第一种方式实现Controller接口。当我们是使用第一种种方式的时候 当遍历haderMappings时,BeanNameUrlHandlerMapping 应该为key为tiger,value为TingerController 结束循环。返回。现在问题来了haderMappings在什么时候初始化的呢,图15

 

图13

HandlerMapping的作用是确定handler的类型是方法,还是类。

 

图14

图15

 

 

图16

图17

 

图18

图19

图20

图21

handerMapping 是从配置文件中获取,图22

图22

图23

上传的时候这个名字是固定的multipartResolver 这个。上传的时候bean名字一定要是这个要不然spring没有办法初始化完成。

 

 

发布了23 篇原创文章 · 获赞 0 · 访问量 755
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览