【SpringMvc执行流程】SpringMvc初始化HandlerAdapters(五)

从onRefresh入手

protected void onRefresh(ApplicationContext context) {
    initStrategies(context);
}
protected void initStrategies(ApplicationContext context) {
    initMultipartResolver(context);
    initLocaleResolver(context);
    initThemeResolver(context);
    initHandlerMappings(context);
    initHandlerAdapters(context);
    initHandlerExceptionResolvers(context);
    initRequestToViewNameTranslator(context);
    initViewResolvers(context);
    initFlashMapManager(context);
}

initHandlerAdaptersinitStrategies方法中被调用。

private void initHandlerAdapters(ApplicationContext context) {

    this.handlerAdapters = getDefaultStrategies(context, HandlerAdapter.class);

}

handlerMapping的处理方式类似,都是从DispatcherServlet.properties文件中加载要处理的类型。

org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\
    org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter

从配置文件中发现有三个adapter供给我们处理。
下面对每个类是否有afterPropertiesSet方法回调。

  • HttpRequestHandlerAdapter 没有
  • SimpleControllerHandlerAdapter 没有
  • RequestMappingHandlerAdapter 有

所以只有RequestMappingHandlerAdapter回调了afterPropertiesSet方法。

public void afterPropertiesSet() {
    // Do this first, it may add ResponseBody advice beans
    initControllerAdviceCache();

    if (this.argumentResolvers == null) {
        List<HandlerMethodArgumentResolver> resolvers = getDefaultArgumentResolvers();
        this.argumentResolvers = new HandlerMethodArgumentResolverComposite().addResolvers(resolvers);
    }
    if (this.initBinderArgumentResolvers == null) {
        List<HandlerMethodArgumentResolver> resolvers = getDefaultInitBinderArgumentResolvers();
        this.initBinderArgumentResolvers = new HandlerMethodArgumentResolverComposite().addResolvers(resolvers);
    }
    if (this.returnValueHandlers == null) {
        List<HandlerMethodReturnValueHandler> handlers = getDefaultReturnValueHandlers();
        this.returnValueHandlers = new HandlerMethodReturnValueHandlerComposite().addHandlers(handlers);
    }
}

这里只是填充了argumentResolversinitBinderArgumentResolversreturnValueHandlers,这些参数都是对参数和返回值的处理集合,后续文章会做详情介绍。


文章作者: Ciwei
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Ciwei !
 上一篇
【SpringMvc执行流程】SpringMvc中的HandlerAdapter handle方法使用(六) 【SpringMvc执行流程】SpringMvc中的HandlerAdapter handle方法使用(六)
从doService方法开始查看 protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
2019-07-20
下一篇 
【SpringMvc执行流程】springMvc请求如何获取相关HandlerMapping(四) 【SpringMvc执行流程】springMvc请求如何获取相关HandlerMapping(四)
在Servlet如何关联spring中,说过当请求来后会被转发到springDispatcherServlet类中的doService方法。 @Override protected void doService(HttpServletR
2019-07-20
  目录