springMVC-启动流程源码分析

1.运行机制:

1.sevlet3.0后多了一个机制:多了一个ServletContainerInitializer配置文件

这个是3.0以后为我们提供的一种项目的初始化方式,当项目启动后,tomcat会自动寻找META-INF/services/

javax.servlet.ServletContainerInitializer,并读取该文件内容.并且内容中按照要求,就是编写一个实现ServletContainerInitializer接口的实现类,项目启动时,运行它的onStartup方法.

2.这个方法中的ServletContext参数,就代表我们的项目对象,所以可以通过它以编码的形式为我们的servlet项目设置filter,listener,servlet属性.

3.springmvc中就是在利用这个机制.他也实现了这个接口,在他的实现类中大致就是在寻找你的项目中所有实现了WebApplicationInitializer接口的方法,并且调用它的onStartup方法.

4.我们在mvc初始化类继承AbstractDispatcherServletInitializer类时,在项目启动时,就会帮我们创构建一个servlet,此时springmvc也就和servlet关联上了.

5.得到DispatcherServlet的步骤梳理:

1.tomcat软件启动

2.Servlet3.0后,tomcat会在项目类路径中寻找下图文件(名字必须一样)

3.在这个文件中配置了实现ServletContainerInitializer接口的实现类的全路径类名.

4.调用这个SpringServletContainerInitializer实现类的onstartUp方法.

5.这个方法里面就会去拉取项目中所有的WebApplicationInitializer接口的所有实现类,运行它们的onStarUp()方法.

6,就会找到我们自己写的springmvc初始化配置里,虽然我们没有实现onstartup方法,但是在父类中实现了.

7.接着就会创建一个名字叫做dispatchServlet的servlet(也就是创建一个前端控制器,所有请求都找他,然后由它分配给不同的方法)

上面的图是下面图中方法名所在的类名

8.在我们自己的实现类中,为这个servlet配置了路径为"/",所以在前端访问我们的资源的时候,都会先被springmvc创建的servlet拦截,然后由他来分配.

###此时我们就得到了DispatcherServlet,下面我们分析springmvc是如何找到我们controller层中的方法的!

1.创建spring容器

(1)请求访问的是servlet,所以最终请求会调用到springmvc创建的DispatcherServlet(前端控制器)中的doservice()方法中(是由父类一层一层调用过来的),我们配置了拦截请求的路径为"/",所以访问任何路径都会来执行这个方法.在这个方法中就会调用,this.doDispatch()方法,来具体处理我们的请求.

(2)当请求进入到this.doDispatch()方法中后,就会调用getHandler()方法,去寻找处理器(也就是去找与请求路径对应的方法,一个路径对应-一个方法,这个键值对就存放在一个map集合中,也就是处理器映射器.)

*处理器映射器会在创建spring容器的时候被创建好,本质就是一个map集合,键就是我们在controller层的类上和每个方法上的@RequestMapping注解中设置的请求路径,值就是对应的方法.

(3)执行完getHandler()方法后,就会执行this.getHandlerAdapter(处理器适配器).这里就会根据当前匹配到的处理器(方法)的要求(各种参数的要求…),为我们准备对应的处理器适配器,来适配我们各种各样的情况,给我们准备各种各样的参数.然后就会调用方法.

(4)然后就会调用方法,执行我们方法中的逻辑.

(5)执行完成后,就会判断你的方法有没有返回值,返回值是什么,有没有加@ResponseBody注解等判断,然后做出不同的处理.

总结:springmvc的流程就是,在项目启动时,首先会根据我们的配置类,创建一个spring容器,然后会为我们创建一个DispatcherServlet,并且把创建好的容器传进去.当有请求访问时,会先到达servlet中的doservice方法中,然后执行doDispatcher()方法,在这个方法中,就会具体处理我们的请求.首先去调用getHandler()方法,去spring容器中的处理器映射器中寻找与请求路径相对应的处理器,然后,在由处理器适配器,为对应的处理器准备它所需要的参数等东西,然后执行处理器中的具体逻辑,执行完成后,就会判断此处理器与返回值相关的东西.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值