SpringMVC源码解读
1.SpringMVC简介
SpringMVC框架是围绕一个DispatherServlet来设计的。这个Servlet会把请求分发给各个处理器,并支持可配置的处理器映射、视图渲染、本地化、时区与主题渲染等,甚至还支持文件上传。处理器是应用中使用注解@Controller和@RequestMapping的类和方法,Spring为处理器方法提供了极其灵活的配置。
“对扩展开放”是Spring web MVC 框架的一个重要的设计原则,而对应Spring整个框架来说,其设计原则是“对扩展开放,对修改关闭”。
2.关于DispatherServlet
从这张图可以清晰的看出,DispatherServlet本质上就是一个Servlet。
引申:Servlet生命周期
2.DispatherServlet初始化过程
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1" metadata-complete="true"> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <servlet> <servlet-name>spring</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-servlet.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>spring</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> </web-app> |
1.Servlet 是个接口
public void init(ServletConfig config) throws ServletException;
2.GenericServlet 中实现了初始化方法。
public void init(ServletConfig config) throws ServletException {
this.config = config;
this.init();//空方法,留给子类实现
}
3.HttpServlet 没有对初始化相关的方法进行覆盖。
4.HttpServletBean,重写了init()方法。
其中又调用了一个initServletBean();方法,这本类中也是个空实现。
5.FrameworkServlet 重写了上边留空的方法:initServletBean();
在initServletBean方法中最重要的就是调用了一个initWebApplicationContext() 方法。
initWebApplicationContext()内部调用了onRefresh(), 这个方法在本类中为空实现,留给子类去实现。
6.DispatcherServlet,找到onRefresh()
@Override
protected void onRefresh(ApplicationContext context) {
initStrategies(context);
}
protected void initStrategies(ApplicationContext context) {
initMultipartResolver(context);
initLocaleResolver(context);
initThemeResolver(context);
initHandlerMappings(context);
initHandlerAdapters(context);
initHandlerExceptionResolvers(context);
initRequestToViewNameTranslator(context);
initViewResolvers(context);
initFlashMapManager(context);
}
至此,DispatherServlet初始化完毕!
3.DispatherServlet工作原理
①:DispatcherServlet是springmvc中的前端控制器(front controller),负责接收request并将request转发给对应的处理组件.
②:HanlerMapping是springmvc中完成url到controller映射的组件.DispatcherServlet接收request,然后从HandlerMapping查找处理request的controller.
③:Cntroller处理request,并返回ModelAndView对象,Controller是springmvc中负责处理request的组件(类似于struts2中的Action),ModelAndView是封装结果视图的组件.
④ ⑤ ⑥:视图解析器解析ModelAndView对象并返回对应的视图给客户端.
4.几个关键的类或接口
HandlerMapping
HandlerExecutionChain
HandlerInterceptor
HandlerAdapter
View
5.分步讲解源码