首先,继承关系如下
上面标注了init方法的重写过程
在FrameworkServlet类中的initServletBean()中,
而
initWebApplicationContext()方法中对父容器的对象进行了获取
再看下面
先看创建容器的方法
它封装了
createWebApplicationContext()方法,这个方法应该是创建原生的容器的
现在我们再来看
initWebApplicationContext() 方法中的刷新容器方法
进入onRefresh()
意思是说,这个方法由它的子类来完成,它的子类就是DispatchServlet,所以我们直接去看DispatchServlet中重写的 onRefresh()
里面又调用了
initStrategies()
并将容器对象作为参数传入了
在刷新完之后,将当前的子容器存入ServletContext域中(web工程的上下文)
我们来看它的key具体是怎么获取的
是一个字符串常量再拼接上当前dispatchServlet的友好别名
这个字符串常量为:
FrameworkServlet的全类名+.CONTEXT.
public static final String SERVLET_CONTEXT_PREFIX = FrameworkServlet.class.getName() + ".CONTEXT.";
所以这个key为
(FrameworkServlet的全类名).CONTEXT.(前端控制器的别名)
综上,我画出大概的初始化流程
其中,子容器是指SpringMVC的ioc容器,父容器是指Spring的ioc容器。
在开发中,我们通常希望将Spring和SpringMVC整合(也就是各干各的,有两个ioc容器),一些情况我们也选择不整合,也就是共用一个ioc容器