先看看DispatcherServlet的类机构:
初始化时序图:
servlet初始化会调用 init 方法,换句话说就是springMVC进行初始化的时候首先会去执行HttpServletBean的init方法, 下面看看HttpServletBean的源码:
上面这段代码主要是在获取你在web.xml中配置在<init-param>中的属性(例如:namespace,contextConfigLocation)。 其中有一点值得注意,那就是initServletBean() 这个方法是由其子类 FrameworkServlet 实现,因此, 接下来 FramworkServlet 会执行 initServletBean 这个方法,下面就继续看看 initServletBean 方法源码:
可以看到initServletBean 方法中就调用了一个 initFrameworkServlet 方法和initWebapplicationContext 方法,其中initFrameworkServlet方法是由子类实现,这个不多说,直接看initWebApplicationContext 方法源码:
代码注释部分已给出解析, 此处不再分析, 上面代码调用了一次createWebApplicationContext方法, 下面就看看这个方法的源码:
以上就是创建webApplicationContext的代码,注释已给出。
还记得FrameworkServlet初始化的时候会调用onRefresh()方法吗,这个方法是留给其子类DispatcherServlet调用的, 最后就该看看DispatcherServlet里面的 onRefresh 方法了:
可以看到onRefresh方法就一句话,调用initStrategies方法, 上面给出了 initStrategies 源码, 很直观,就是在初始化springMVC 的一系列组件, 但是此处你要明白,SpringMVC的组件其实已经在webApplicationContext创建时就已经实例化了, 此处所谓的初始化只是在选择合适的组件(每一个组件都对应了几个不同的实现)。OK, 至此, springMVC 的初始化完成!新闻热点
疑难解答