我们知道关于Spring MVC命名空间内的元素解析,是通过MvcNamespaceHandler处理。
由MvcNamespaceHandler类可以在init()函数中先注册了annotation-driven,default-servlet-handler,interceptors,resource,view-controllers等各种元素解析器。
1、AnnotationDrivenBeanDefinitionParser类
该类为解析MVC的annotation提供了parser实例,并没有真正的去解析Bean定义。
默认的配置内容为
当在BeanDefintion读取时,首先进入红色框框中,创建RootBeanDefinition,并保存到Registry中。
之后,处理annotation-driven中是否包含”enable-maxtrix-variables’或‘enableMaxtrixVariables’,如果包含,则在handlerMappingDef中增加removeSemicolonContent属性。
获取ConversionService类,用于类型转换。首先查看xml文件中是否有配置,如果没配置,则生成默认的FormattingConversionServiceFactoryBean对象。
获取Validator类,增加参数校验;首先是查看是否配置了“validator”,其次如果支持JSR300则默认生成LocalValidatorFactoryBean,否则返回NULL。
获取MessageCodesResolver类;判断是否配置了message-codes-resolver属性,配置了获取RuntimeBeanReference,否则返回NULL。
生成ConfigurableWebBindingInitializer类;生成之后,主要是将conversionService,validator,和messageCodesResolver放在生成的对象里头。
获取messageConverter类,用于消息格式转换;1)首先获取配置的mvc:message-converters参数里头的配置,并解析出子类后放到messageConverters。
2)如果register-defaults=true,则需要将默认的messageConvertes也注册进去,包括ByteArrayHttpMessageConverter,StringHttpMessageConverter,ResourceHttpMessageConverter,SourceHttpMessageConverter,AllEncompassingFormHttpMessageConverter,AtomFeedHttpMessageConverter,RssChannelHttpMessageConverter,Jaxb2RootElementHttpMessageConverter,Jaxb2RootElementHttpMessageConverter,MappingJacksonHttpMessageConverter。
获取argumentResolver用于输入参数校验;获取argument-resolvers配置的输入参数校验。
获取ReturnValueHandler用于输出参数转换;获取“return-value-handlers”配置的输出参数转换功能。
获取异步处理超时时间;获取async-support属性设置,为空返回null。
获取回调拦截器,获取task-executor属性配置,即异步处理的任务在该线程池中处理;
获取回调拦截器;读取callable-interceptors属性里头的拦截器Bean。
获取延迟处理结果拦截器;读取defered-result-interceptors属性里头的拦截器Bean。
生成RequetMappingHandlerAdaptor类,该方法是最终需要进行具体业务处理的类,增加了contentNegotiationManager,WebBindingInitializer,和messageConverters来在handle前后进行拦截处理。
注册HandlerAdaptor到上下文中;在注册之前,增加上面的各种Bean。
创建CompositeUriComponentsContributorFactoryBean类,并以名称为mvcUriComponentsContributor注册
创建转换器暴露拦截器ConversionServiceExposingInterceptor,以及注册MappedInterceptor类,详解见参考3。
创建异常统一处理器ExceptionHandlerExceptionResolver并注册;
创建响应状态异常拦截器ResponseStatusExceptionResolver类,以及默认的DefaultHandlerExceptionResolver类,并注册。
在parseContext中保存特定的其它组合信息(例如HandlerAdaptor名称和HandlerAdaptor实例)。
增加注册默认的组件,BeanNameUrlHandlerMapping,HttpRequestHandlerAdaptor,和SimpleControllorHandlerAdaptor三个。