SpringMVC源码分析

<强>

springMVC是一个建立在春天框架基础之上的一个web层框架,它负责发送每个请求到合适的处理程序,使用视图来最终返回响应结果的概念。

,

springMVC最重要的一个类是DispatchServlet这个类,当我们打开这个源码,感到一脸蒙蔽。但是坐下来冷静一下看看,发现,这个东西竟然继承了一些类

 springMVC源码分析

跟过去看看

 springMVC源码分析

好像也没啥线索,继续跟

 springMVC源码分析

这时有了重大发现,发现这个DispatchServlet终归结底还是继承了HttpServlet,那么我们就可以按照普通的servlet的生命周期来分析它了。

servlet的生命周期大家都还记得吧,不记得没关系,我来简单列一下

1。首先tomcat启动的时候会去查询网站。xml中的配置文件找到servlet的配置,然后会通过新关键字创建这个servlet的实例。

2。然后调用这个servlet的init方法去初始化,然后把这个servlet放入容器中管理,等待使用。

3。当容器关闭时,tomcat会调用这个servlet的destroy方法来做一些善后工作。

Ok,下面我们就找init方法吧,看看这里面都干了些什么吧

SpringMVC源码分析

这里面没有什么太复杂的逻辑,就是把配置DispatchServlet配置参数加载到内存中,以供spring使用。有的朋友就问了,什么参数

SpringMVC源码分析主要就是这里面调用了initServletBean方法,这个方法在这个类中是空的,而它的子类实现了它,springmvc中用了很多类似的设计模式,叫模板方法模式。简单讲就是在父类中写好,你要调用哪些方法,我在子类中去实现,这样就按照了父类的逻辑顺序调用了相应的方法,而且子类可以有不同的实现。

好,下面我么就找哪个子类实现了这个initServletBean方法吧,跟我走。。。

看看这个HttpServletBean的继承体系如下

SpringMVC源码分析

先找FrameworkServlet

我们寻寻觅觅,果然没猜错,方法的实现,写在了子类,而且还不少,我来分析下吧

SpringMVC源码分析

略过日志记录往下走

调用了当前类中写的一个方法initWebApplicationContext方法,这个方法就很重要了,坐下来,喝杯茶,慢慢品尝spring这道美味可口的大餐。

先把源码粘上来,


第一步spring通过工具类获取父级WebApplicationContext容器,有的朋友问了,这个父级容器哪来的,何时创建的。

就是在这个监听器运行的时候创建的,我们知道web服务器启动的时候,3大组件的创建顺序是Listener>Filter>Servlet。

所以这里是可以获取到父级容器的。当然也可以获取不到这种情况就不讨论了,因为,不可能说你用springMVC而不用spring框架的。

SpringMVC源码分析

这里有几个if判断,我已经标号了,给大家分析一下执行流。

首先webApplicationContext一定是空的,为什么,因为你刚启动,肯定是空的。所以第一个if暂时不会执行。进入到第二个if了,这里调用了findWebApplicationContext,其实这里也会返回一个null,从这个findwebApplicationContext名称就知道,它只查找并不创建。把源码附上,大家看看

SpringMVC源码分析

因此wac还是空的,所以进入第三个if语句,我们进到createWabApplicationContext方法中一探究竟。

SpringMVC源码分析