SpringMvc初始化HandlerAdapters(五)


github原文链接 https://github.com/DespairYoke/java-advance。创作不易,请给个免费的star,已表支持。

从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,这些参数都是对参数和返回值的处理集合,后续文章会做详情介绍。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容