1.目的
研究一下springmvc的源码。(spring的源码是基于spring3.0)
2.大概认知
springmvc中有个大家都知道的类DispatcherServlet,这个类是继承httpServlet的。所以本质上其实就在一个servlet中启动了一个spring的容器!!!
3.配置
对于springmvc的配置,如何配置我就不重复了,这个网上一大堆可以百度到。
我这边针对web.xml这个配置文件,做一点说明。
3.1配置方式一:(web.xml)
<!-- Spring MVC配置 -->
<!-- ====================================== -->
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 可以自定义servlet.xml配置文件的位置和名称,默认为WEB-INF目录下,名称为[<servlet-name>]-servlet.xml,如spring-servlet.xml
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-servlet.xml</param-value>
</init-param>
-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<!-- Spring配置 -->
<!-- ====================================== -->
<listener>
<listenerclass>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<!-- 指定Spring Bean的配置文件所在目录。默认配置在WEB-INF目录下 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:config/applicationContext.xml</param-value>
</context-param>
配置说明
ContextLoaderListener这个其实是监听web容器启动之后创建一个spring的容器。这个是父容器。
而DispatcherServlet的也会创建一个spring的容器,这个是子容器。spring容器创建的时候可以指定父容器的,所以这个子容器启动的时候就指定了父容器。
注:
1.DispatcherServletContextLoaderListener这个是先创建父容器,DispatcherServlet是后创建子容器。
2.getBean()的时候,先从父容器中取bean,父容器中没有再去从子容器中取bean.
具体的源代码见这个博客吧(这个写的很好,虽然我的源代码跟他有点出入,但是大致的流程是一样的)
https://blog.csdn.net/MrZhangXL/article/details/78587426
3.2配置方式二:(web.xml)
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 配置SpringMVC下的配置文件位置及名称 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
配置说明
这个其实就仅仅配置了DispatcherServlet,那么从刚才可以知道,这里其实仅仅创建了一个spring的容器,只不过这个容器里面没有父容器而已。
4.上面就是springmvc的配置,下面我们来进入springmvc的具体源码的讲解
Springmvc中涉及到这几个类
HandlerMapping:这个类中有一个方法,这个方法就是来找到HandlerExecutionChain
所以这个类本质根据url来查找到HandlerExecutionChain
HandlerExecutionChain:这个类中最重要的方法getHandler(),getInterceptors()
getHandler()作用获取bean,(这个bean就是Controller)。
getInterceptors()作用获取的拦截器
所以这个类本质就是保存了bean,Interceptors的一个类
HandlerAdapter:
这个类是如何生成的?通过handler来决定那个HandlerAdapter
这个类主要的方法:ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler)
即handler对象作为参数传递给HandlerAdapter的实例化对象,调用其handler方法会生成一个ModelAndView对象;
那这个类本质就是生成一个ModelAndView的对象
ViewResolver视图解析器
通过ViewResolver视图解析器,将上一步骤中生成的ModelAndView解析为View;
DispatcherServlet根据获取到View,将视图返回给用户。
那么来总结一下吧
1.HandlerMapping来根据url查找到HandlerExecutionChain(handler,interceptor)
2.HandlerExecutionChain得到handler,HandlerAdapter根据handler来找到modelAndView
3.ViewResolver视图解析器,将上一步骤中生成的ModelAndView解析为View;
DispatcherServlet根据获取到View,将视图返回给用户。
注:interceptor的过程就暂时不加入到这个过程吧。这个就留个大家自己去看下源码吧。(提示:interceptor的过程肯定是围绕第二步的前面和后面)
最后推荐这篇文章哈(这个讲解的比较好)
https://www.cnblogs.com/chenjunjie12321/articles/6118426.html
网友评论