第172行
// Let subclasses do whatever initialization they like.
initServletBean();
看上面第注释就是,子类想怎么实现初始化就怎么初始化,看来这才是最重要的地方。所以在HttpServletBean类中,这个方法也是一个空方法。我们来看看他的子类org.springframework.web.servlet.FrameworkServlet是怎么实现的吧。
直接上代码图
FrameworkServlet中的initServletBean()的实现
initServletBean中();看到了我们熟悉的webApplicationContext, 并且把引用给了成员变量。
随后便是initFrameworkServlet()这个方法也是一个空方法,是去让子类自己去实现初始化的一个方法,或者是说spring暴露给我们去使用的一个方法。
那么重点就是initWebApplicationContext()需要如何初始化了。下面贴代码。
initWebApplicationContext()的实现看上面的注释,一开始初始化肯定是什么上下文都没有,所以需要创建。所以我们关注一下558行。
//No conetxt instance is defined for this servlet - > create a local one
所以这个代码可以关注一下,看创建了什么,怎么创建的。
在FrameworkServlet中的实现此方法还调用了一个重载方法
protected WebApplicationContext createWebApplicationContext(@NullableApplicationContext parent)
下面我们看一下这个方法的实现。
createWebApplicationContext(@NullableApplicationContext parent)方法实现这个方法里面,就是生成了一个上下文对象,然后生成完之后,将对应的servletConfig的相关信息注入到对应的成员变量中去。
创建完上下文之后,便是到了565行onRefresh,在FrameworkServlet类里面,这也是一个空方法。如图
onRefresh方法他的具体实现就是我们预期的org.springframework.web.servlet.DispatcherServlet。
下面看看实现
onRefresh的具体实现这些方法就是如何初始化Spring的相关组件。
网友评论