前言
本篇文章重点看了init阶段,springmvc代码量大,有些部分存在理解不透得情况,本文作为自身平常学习记录,不建议大家阅读学习。
首先贴张网上看到得概览图,下图有一个地方我认为是错的,就是第4步和第7步得执行者和接收者应该是DispatchServlet,其他得都没什么问题。
分析
首先从图中可以看出,DispatchServlet实现了Servlet接口,从本质上来看还是一个Servlet。那么一个Servlet的生命周期是
初始化init方法
处理请求阶段service方法
结束阶段destroy方法
因此我们先看DispatchServlet的init方法,DispatchServlet的init方法在HttpServletBean中实现。代码如下:
1 | public final void init() throws ServletException { |
FrameworkServlet.class->initServletBean()
1 | protected final void initServletBean() throws ServletException { |
FrameworkServlet.class->initWebApplicationContext()
1 | protected WebApplicationContext initWebApplicationContext() { |
FrameworkServlet->configureAndRefreshWebApplicationContext(ConfigurableWebApplicationContext wac)
1 | protected void configureAndRefreshWebApplicationContext(ConfigurableWebApplicationContext wac) { |
AbstractApplicationContext.class->refresh()
1 | public void refresh() throws BeansException, IllegalStateException { |
DispatchServlet.class->initHandlerMappings(ApplicationContext context)
1 | private void initHandlerMappings(ApplicationContext context) { |
初始化完毕后初始化adapter等一系列东西。然后根据设定类和url的对应关系,比如我使用的是注解开发@RequestMapping和@Controller,那么这些被注解的类会被划分为url和类的对应关系存放在map中。
AbstractHandlerMethodMapping ->initHandlerMethods()
1 | //注解开发 |
然后开始servlet的第二个周期—service。
DispatchServlet得service由FrameworkServlet实现。
1 | protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { |
HttpServlet.class->service(HttpServletRequest req, HttpServletResponse resp)
1 | protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { |
最后进入DispatchServlet得doDispatch,无论哪种方法都需要在此处被拦截
DispatchServlet.class->doDispatch(HttpServletRequest request, HttpServletResponse response)
1 | protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception { |
service包括后面阶段我认为比init阶段要简单不少,因此描述比较少。