《Java架构筑基》——详解SpringMvc初始化HandlerAdapters

349 阅读1分钟

从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);
}

initHandlerAdapters在initStrategies方法中被调用。

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);
    }
}

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