Springmvc
加载、初始化、运行 扫描包、实例化类、加入ioc容器、初始化HanlderMapping
HttpServletBean直接继承java的HttpServlet,作用是将Servlet中配置的参数设置到相应的属性; FrameworkServlet初始化了WebApplicationServlet;
springmvc配置中执行请求的是DispatcherServlet,以下为往上追溯的继承关系
public class DispatcherServlet extends FrameworkServlet
public abstract class FrameworkServlet extends HttpServletBean implements ApplicationContextAware
public abstract class HttpServletBean extends HttpServlet implements EnvironmentCapable, EnvironmentAware
public interface ApplicationContextAware extends Aware
实际执行的是HttpServletBean中的init方法,在此处方法内部调用了initBeanWrapper(bw)
和initServletBean();
两个空方法,这两个方法由子类提供实现,其中在前者的注释是“Let subclasses do whatever initialization they like.”,就是说其它上下文的初始化工作交给子类来实现。 当然,这个init方法并不是空的,后面再做说明。
FrameWorkServlet
在这个Servlet中重写了initServletBean方法,这个里面除了输出一些日志信息和记录启动时间外,还执行了
try {
// 初始化web环境的上下文,Initialize and publish the WebApplicationContext for this servlet.此处稍后再解释一下
this.webApplicationContext = initWebApplicationContext();
/**
* This method will be invoked after any bean properties have been set and
* the WebApplicationContext has been loaded. The default implementation is empty;
* subclasses may override this method to perform any initialization they require.
* @throws ServletException in case of an initialization exception
*/
initFrameworkServlet();
}
我们可以看到,在DispatherServlet中众多init方法最初是被重写的onRefresh方法调用,这个调用也是在上面的 initWebApplicationContext中。
protected void initStrategies(ApplicationContext context) {
initMultipartResolver(context);
initLocaleResolver(context);
initThemeResolver(context);
initHandlerMappings(context);
initHandlerAdapters(context);
initHandlerExceptionResolvers(context);
initRequestToViewNameTranslator(context);
initViewResolvers(context);
initFlashMapManager(context);
}
后期包装返回值
package org.springframework.web.servlet.mvc.method.annotation;
public class ServletInvocableHandlerMethod extends InvocableHandlerMethod {
try {
// 这个地方处理返回值
this.returnValueHandlers.handleReturnValue(
returnValue, getReturnValueType(returnValue), mavContainer, webRequest);
}
}