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
繼承該類,重寫了AbstractHandlerMapping
的initApplicationContext
方法,除了調用一遍父類方法,還進行了url註冊
AbstractDetectingUrlHandlerMapping
繼承該類,也重寫了AbstractHandlerMapping
的initApplicationContext
方法,在其中註冊handler,但是handler的選擇通過抽象方法determineUrlsForHandler
交由子類實現
AbstractHandlerMethodMapping
不同於AbstractUrlHandlerMapping
,該類的handler是方法而不是類。如@RequestMapping
註解的方法。
實現InitializingBean
,在afterPropertiesSet
中調用initHandlerMethods
進行註冊handler,類似url,但是它的對應關係是url和method。
在initHandlerMethods
中需要子類實現抽象方法isHandler
和getMappingForMethod
。前者用於判斷該方法能否作爲handler,後者用於獲取該handler
總結
通過抽象類完成主體流程並提供抽象方法,子類只需完成抽象方法即可。