Spring MVC 源碼學(xué)習(xí)-AnnotationDrivenBeanDefinitionParser剖析

我們知道關(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è)椭岩。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市璃赡,隨后出現(xiàn)的幾起案子判哥,更是在濱河造成了極大的恐慌,老刑警劉巖碉考,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件塌计,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡侯谁,警方通過(guò)查閱死者的電腦和手機(jī)锌仅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)章钾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人热芹,你說(shuō)我怎么就攤上這事贱傀。” “怎么了伊脓?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵府寒,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我报腔,道長(zhǎng)株搔,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任纯蛾,我火速辦了婚禮纤房,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘茅撞。我一直安慰自己帆卓,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布米丘。 她就那樣靜靜地躺著剑令,像睡著了一般。 火紅的嫁衣襯著肌膚如雪拄查。 梳的紋絲不亂的頭發(fā)上吁津,一...
    開(kāi)封第一講書(shū)人閱讀 49,772評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音堕扶,去河邊找鬼碍脏。 笑死,一個(gè)胖子當(dāng)著我的面吹牛稍算,可吹牛的內(nèi)容都是我干的典尾。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼糊探,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼钾埂!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起科平,我...
    開(kāi)封第一講書(shū)人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤褥紫,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后瞪慧,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體髓考,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年弃酌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了氨菇。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片儡炼。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖门驾,靈堂內(nèi)的尸體忽然破棺而出射赛,到底是詐尸還是另有隱情,我是刑警寧澤奶是,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布楣责,位于F島的核電站,受9級(jí)特大地震影響聂沙,放射性物質(zhì)發(fā)生泄漏秆麸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一及汉、第九天 我趴在偏房一處隱蔽的房頂上張望沮趣。 院中可真熱鬧,春花似錦坷随、人聲如沸房铭。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)缸匪。三九已至,卻和暖如春类溢,著一層夾襖步出監(jiān)牢的瞬間凌蔬,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人柬泽。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像辩诞,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子纺涤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容