我們知道關(guān)于Spring MVC命名空間內(nèi)的元素解析,是通過(guò)MvcNamespaceHandler處理陶衅。
由MvcNamespaceHandler類可以在init()函數(shù)中先注冊(cè)了annotation-driven,default-servlet-handler,interceptors,resource,view-controllers等各種元素解析器屡立。
1、AnnotationDrivenBeanDefinitionParser類
該類為解析MVC的annotation提供了parser實(shí)例搀军,并沒(méi)有真正的去解析Bean定義膨俐。
默認(rèn)的配置內(nèi)容為
當(dāng)在BeanDefintion讀取時(shí),首先進(jìn)入紅色框框中罩句,創(chuàng)建RootBeanDefinition焚刺,并保存到Registry中。
之后门烂,處理annotation-driven中是否包含”enable-maxtrix-variables’或‘enableMaxtrixVariables’乳愉,如果包含兄淫,則在handlerMappingDef中增加removeSemicolonContent屬性。
獲取ConversionService類蔓姚,用于類型轉(zhuǎn)換捕虽。首先查看xml文件中是否有配置,如果沒(méi)配置坡脐,則生成默認(rèn)的FormattingConversionServiceFactoryBean對(duì)象泄私。
獲取Validator類,增加參數(shù)校驗(yàn)挨措;首先是查看是否配置了“validator”挖滤,其次如果支持JSR300則默認(rèn)生成LocalValidatorFactoryBean,否則返回NULL浅役。
獲取MessageCodesResolver類斩松;判斷是否配置了message-codes-resolver屬性,配置了獲取RuntimeBeanReference觉既,否則返回NULL惧盹。
生成ConfigurableWebBindingInitializer類;生成之后瞪讼,主要是將conversionService钧椰,validator,和messageCodesResolver放在生成的對(duì)象里頭符欠。
獲取messageConverter類嫡霞,用于消息格式轉(zhuǎn)換;1)首先獲取配置的mvc:message-converters參數(shù)里頭的配置希柿,并解析出子類后放到messageConverters诊沪。
2)如果register-defaults=true,則需要將默認(rèn)的messageConvertes也注冊(cè)進(jìn)去,包括ByteArrayHttpMessageConverter曾撤,StringHttpMessageConverter端姚,ResourceHttpMessageConverter,SourceHttpMessageConverter挤悉,AllEncompassingFormHttpMessageConverter渐裸,AtomFeedHttpMessageConverter,RssChannelHttpMessageConverter装悲,Jaxb2RootElementHttpMessageConverter昏鹃,Jaxb2RootElementHttpMessageConverter,MappingJacksonHttpMessageConverter诀诊。
獲取argumentResolver用于輸入?yún)?shù)校驗(yàn)盆顾;獲取argument-resolvers配置的輸入?yún)?shù)校驗(yàn)。
獲取ReturnValueHandler用于輸出參數(shù)轉(zhuǎn)換畏梆;獲取“return-value-handlers”配置的輸出參數(shù)轉(zhuǎn)換功能您宪。
獲取異步處理超時(shí)時(shí)間奈懒;獲取async-support屬性設(shè)置,為空返回null宪巨。
獲取回調(diào)攔截器磷杏,獲取task-executor屬性配置,即異步處理的任務(wù)在該線程池中處理捏卓;
獲取回調(diào)攔截器极祸;讀取callable-interceptors屬性里頭的攔截器Bean。
獲取延遲處理結(jié)果攔截器怠晴;讀取defered-result-interceptors屬性里頭的攔截器Bean遥金。
生成RequetMappingHandlerAdaptor類,該方法是最終需要進(jìn)行具體業(yè)務(wù)處理的類蒜田,增加了contentNegotiationManager稿械,WebBindingInitializer,和messageConverters來(lái)在handle前后進(jìn)行攔截處理冲粤。
注冊(cè)HandlerAdaptor到上下文中美莫;在注冊(cè)之前,增加上面的各種Bean梯捕。
創(chuàng)建CompositeUriComponentsContributorFactoryBean類厢呵,并以名稱為mvcUriComponentsContributor注冊(cè)
創(chuàng)建轉(zhuǎn)換器暴露攔截器ConversionServiceExposingInterceptor,以及注冊(cè)MappedInterceptor類傀顾,詳解見(jiàn)參考3襟铭。
創(chuàng)建異常統(tǒng)一處理器ExceptionHandlerExceptionResolver并注冊(cè);
創(chuàng)建響應(yīng)狀態(tài)異常攔截器ResponseStatusExceptionResolver類短曾,以及默認(rèn)的DefaultHandlerExceptionResolver類蝌矛,并注冊(cè)。
在parseContext中保存特定的其它組合信息(例如HandlerAdaptor名稱和HandlerAdaptor實(shí)例)错英。
增加注冊(cè)默認(rèn)的組件,BeanNameUrlHandlerMapping隆豹,HttpRequestHandlerAdaptor,和SimpleControllorHandlerAdaptor三個(gè)椭岩。