Spring MVC - HandlerMapping思路分析

HandlerMapping分析

	HandlerMapping用於尋找處理對應請求的Handler

0x01 流程瞭解

第一點:瞭解HandlerMapping接口

HandlerMapping是個接口,主要需要實現方法getHandler(HttpServletRequest),雖然是返回對應Handler,實際上是返回類HandlerExecutionChain

第二點:瞭解HandlerExecutionChain

該類組合了Handler和Interceptor,提供了Interceptor的前後置調用方法。以及Handler相關的設置獲取方法

0x02 設計思路

HandlerMapping設計思路主體爲模板方法模式,AbstractHandlerMapping作爲HandlerMapping的抽象類,主要有兩點:

第一點:定義瞭如何獲取Handler的方法框架,子類只需要實現具體算法即可。即重寫方法getHandlerInternal即可

第二點:定義瞭如何初始化Interceptor,通過繼承類WebApplicationObjectSupport,該類實現了ApplicationContextAware接口,在setApplicationContext方法中調用了initApplicationContext方法,該方法被重載提供了無參方法,類似GenericServlet中的init方法。

AbstractUrlHandlerMapping

繼承了AbstractHandlerMapping,重寫了getHandlerInternal方法。該類是AbstractHandlerMapping的一個分支,通過Map將url和對應handler進行關聯。提供了註冊方法交由子類實現。

SimpleUrlHandlerMapping繼承該類,重寫了AbstractHandlerMappinginitApplicationContext方法,除了調用一遍父類方法,還進行了url註冊

AbstractDetectingUrlHandlerMapping繼承該類,也重寫了AbstractHandlerMappinginitApplicationContext方法,在其中註冊handler,但是handler的選擇通過抽象方法determineUrlsForHandler交由子類實現

AbstractHandlerMethodMapping

不同於AbstractUrlHandlerMapping,該類的handler是方法而不是類。如@RequestMapping註解的方法。

實現InitializingBean,在afterPropertiesSet中調用initHandlerMethods進行註冊handler,類似url,但是它的對應關係是url和method。

initHandlerMethods中需要子類實現抽象方法isHandlergetMappingForMethod。前者用於判斷該方法能否作爲handler,後者用於獲取該handler

總結

通過抽象類完成主體流程並提供抽象方法,子類只需完成抽象方法即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章