Springmvc源码分析

113 阅读4分钟

主要类

  1. DispatcherServlet

入口类,继承FrameworkServlet,加载各个功能的实现类(从spring上下文获取对象)。比如异常处理、视图处理、请求映射处理等(initStrategies)。

protected void initStrategies(ApplicationContext context) {

    //初始化文件流解析

   initMultipartResolver(context);

   //初始化本地解析器

   initLocaleResolver(context);

   //初始化主题解析器

   initThemeResolver(context);

   //初始化处理器映射器,将请求映射到处理器

   initHandlerMappings(context);

   //初始化处理器适配器

   initHandlerAdapters(context);

   //初始化处理器异常解析器,如果执行过程中遇到异常将交给HandlerExceptionResolver来解析

   initHandlerExceptionResolvers(context);

   //初始化请求到具体视图名称解析器

   initRequestToViewNameTranslator(context);

   //初始化视图解析器

   initViewResolvers(context);

   //初始化flash映射管理

   initFlashMapManager(context);

}
  1. FrameworkerServlet

继承HttpServletBean,同时实现了ApplicationConextAware,获取web上下文AnnotationConfigServletWebServerApplicationContext,同时重写initServletBean方法(HttpServletBean方法),调用DispatcherServlet的onRefresh方法,加载各个功能的实现类

  1. HttpServletBean

继承HttpServlet,重写了init方法,主要做一些初始化的工作,在第一次请求会被调用。

  1. WebMvcConfigurationSupport

    1. 启动时将RequestMappingHandlerMapping和RequestMappingHandlerAdapter这些bean添加到spring管理(DispatcherServlet中会拉取)
    2. 负责将实现WebMvcConfigure的类集合,统一回调,添加拦截器HandlerInterceptor,HttpMessageConveter等,添加到使用处。
    3. 拦截器HandlerInterceptor
protected final Object[] getInterceptors(

      FormattingConversionService mvcConversionService,

      ResourceUrlProvider mvcResourceUrlProvider) {

   if (this.interceptors == null) {

      InterceptorRegistry registry = new InterceptorRegistry();

      //调用WebMvcConfigure实现类回调接口,添加拦截器

      addInterceptors(registry);

      registry.addInterceptor(new ConversionServiceExposingInterceptor(mvcConversionService));

      registry.addInterceptor(new ResourceUrlProviderExposingInterceptor(mvcResourceUrlProvider));

      this.interceptors = registry.getInterceptors();

   }

   return this.interceptors.toArray();

}





@Bean

@SuppressWarnings("deprecation")

public RequestMappingHandlerMapping requestMappingHandlerMapping(

      @Qualifier("mvcContentNegotiationManager") ContentNegotiationManager contentNegotiationManager,

      @Qualifier("mvcConversionService") FormattingConversionService conversionService,

      @Qualifier("mvcResourceUrlProvider") ResourceUrlProvider resourceUrlProvider) {



   RequestMappingHandlerMapping mapping = createRequestMappingHandlerMapping();

   mapping.setOrder(0);

   //此处塞拦截器

   mapping.setInterceptors(getInterceptors(conversionService, resourceUrlProvider));

DelegatingWebMvcConfiguration类



private final WebMvcConfigurerComposite configurers = new WebMvcConfigurerComposite();

@Override

protected void addInterceptors(InterceptorRegistry registry) {

   this.configurers.addInterceptors(registry);

}

WebMvcConfigurerComposite类

@Override

public void addInterceptors(InterceptorRegistry registry) {

    //遍历所有WebMvcConfigurer的实现类,回调

   for (WebMvcConfigurer delegate : this.delegates) {

      delegate.addInterceptors(registry);

   }

}
  1. 消息处理器HttpMessageConveter

装配RequestMappingHandlerAdapter

@Bean

public RequestMappingHandlerAdapter requestMappingHandlerAdapter(

      @Qualifier("mvcContentNegotiationManager") ContentNegotiationManager contentNegotiationManager,

      @Qualifier("mvcConversionService") FormattingConversionService conversionService,

      @Qualifier("mvcValidator") Validator validator) {



   RequestMappingHandlerAdapter adapter = createRequestMappingHandlerAdapter();

   adapter.setContentNegotiationManager(contentNegotiationManager);

   // 此处为RequestMappingHandlerAdapter的messageConverter设置属性值

   adapter.setMessageConverters(getMessageConverters());

   adapter.setWebBindingInitializer(getConfigurableWebBindingInitializer(conversionService, validator));

   adapter.setCustomArgumentResolvers(getArgumentResolvers());

   adapter.setCustomReturnValueHandlers(getReturnValueHandlers());



   if (jackson2Present) {

      adapter.setRequestBodyAdvice(Collections.singletonList(new JsonViewRequestBodyAdvice()));

      adapter.setResponseBodyAdvice(Collections.singletonList(new JsonViewResponseBodyAdvice()));

   }



   AsyncSupportConfigurer configurer = new AsyncSupportConfigurer();

   configureAsyncSupport(configurer);

   if (configurer.getTaskExecutor() != null) {

      adapter.setTaskExecutor(configurer.getTaskExecutor());

   }

   if (configurer.getTimeout() != null) {

      adapter.setAsyncRequestTimeout(configurer.getTimeout());

   }

   adapter.setCallableInterceptors(configurer.getCallableInterceptors());

   adapter.setDeferredResultInterceptors(configurer.getDeferredResultInterceptors());



   return adapter;

}



/**

获取HttpMessageConverter

1.从spring容器里获取实现了HttpMessageConverter的类,见(HttpMessageConverters)

public HttpMessageConverters(Collection<HttpMessageConverter<?>> additionalConverters) {

   this(true, additionalConverters);

}

2. HttpMessageConverters会调用WebMvcConfigurationSupport的getMessageConverters方法,获取默认HttpMessageConverter

3.从spring容器获取实现接口WebMvcConfigure的实现类,回调configureMessageConverters方法获取

**/

protected final List<HttpMessageConverter<?>> getMessageConverters() {

   if (this.messageConverters == null) {

      this.messageConverters = new ArrayList<>();

      configureMessageConverters(this.messageConverters);

      if (this.messageConverters.isEmpty()) {

         addDefaultHttpMessageConverters(this.messageConverters);

      }

      extendMessageConverters(this.messageConverters);

   }

   return this.messageConverters;

}

DelegatingWebMvcConfiguration类

private final WebMvcConfigurerComposite configurers = new WebMvcConfigurerComposite();

@Override

protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) {

   this.configurers.configureMessageConverters(converters);

}

WebMvcConfigurerComposite类

@Override

public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {

   for (WebMvcConfigurer delegate : this.delegates) {

       //所有实现类回调,添加HttpMessageConverter

      delegate.configureMessageConverters(converters);

   }

}

RequestMappingHandlerAdapter类实现了InitializingBean,会在bean实例化的时候调用

@Override

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

   }

}





private List<HandlerMethodReturnValueHandler> getDefaultReturnValueHandlers() {

   List<HandlerMethodReturnValueHandler> handlers = new ArrayList<>(20);



   // Single-purpose return value types

 handlers.add(new ModelAndViewMethodReturnValueHandler());

   handlers.add(new ModelMethodProcessor());

   handlers.add(new ViewMethodReturnValueHandler());

   handlers.add(new ResponseBodyEmitterReturnValueHandler(getMessageConverters(),

         this.reactiveAdapterRegistry, this.taskExecutor, this.contentNegotiationManager));

   handlers.add(new StreamingResponseBodyReturnValueHandler());

   handlers.add(new HttpEntityMethodProcessor(getMessageConverters(),

         this.contentNegotiationManager, this.requestResponseBodyAdvice));

   handlers.add(new HttpHeadersReturnValueHandler());

   handlers.add(new CallableMethodReturnValueHandler());

   handlers.add(new DeferredResultMethodReturnValueHandler());

   handlers.add(new AsyncTaskMethodReturnValueHandler(this.beanFactory));



   // Annotation-based return value types

 handlers.add(new ModelAttributeMethodProcessor(false));

   // 此处会添加HttpMessageConverter,在处理@ResponseBody注解返回值序列化的时候使用

   handlers.add(new RequestResponseBodyMethodProcessor(getMessageConverters(),

         this.contentNegotiationManager, this.requestResponseBodyAdvice));



   // Multi-purpose return value types

 handlers.add(new ViewNameMethodReturnValueHandler());

   handlers.add(new MapMethodProcessor());



   // Custom return value types

 if (getCustomReturnValueHandlers() != null) {

      handlers.addAll(getCustomReturnValueHandlers());

   }



   // Catch-all

 if (!CollectionUtils.isEmpty(getModelAndViewResolvers())) {

      handlers.add(new ModelAndViewResolverMethodReturnValueHandler(getModelAndViewResolvers()));

   }

   else {

      handlers.add(new ModelAttributeMethodProcessor(true));

   }



   return handlers;

}

流程

  1. 方法入口:FrameworkerServlet重写了service方法,和doGet,doPost等方法,最终调用DispatcherServlet的doService方法

  2. springmvc请求流程:DispatcherServlet拦截到请求,从HandlerMapping集合中根据请求的url获取对应的HandlerExecutionChain,里面包括Handler和HandlerInterceptor,HandlerMapping的主要实现包括

    1. SimpleUrlHandlerMapping:处理简单请求,不经controller实现路由跳转的;
    2. RequestMappingHandlerMapping:处理requestmapping请求方法,返回HandlerMethod
  3. 再根据获取的Handler获取HandlerAdapter适配器,调用supports方法,HandlerAdapter主要实现有:

    1. RequestMappingHandlerAdapter,处理@requestMapping方法,handler是HandlerMethod;
    2. HttpRequestHandlerAdapter, 处理实现HttpRequestHandler接口的类
    3. SimpleControllerHandlerAdapter:处理实现Controller的类;获取到对应的HandlerAdapter实现类,并调用handler方法,处理逻辑,返回ModelAndView,渲染视图
  4. 执行HandlerAdapter的handle方法,处理请求方法,最终调用RequestMappingHandlerAdapter的handleInternal方法,会根据前面获取的HandlerMethod,执行方法的业务逻辑invokeAndHandle,获取原始返回值(未序列化)

  5. 遍历所有的HandlerMethodReturnValueHandler,返回值处理器,匹配RequestResponseBodyMethodProcessor(@ResponseBody处理器),获取所有的HttpMessageConverter,对返回值序列化处理

  6. 启动Bean注册实例化流程

    1. DispatcherServletConfiguration类会注册DispatcherServlet,同时会根据ApplicationAware回调为FrameworkerServlet设置web上下文
    2. WebMvcConfigurationSupport类会将HandlerMapping和HandlerAdapter等实现类注册到spring上下文,后期会在DispatcherServlet类中加载这些bean