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
总结
通过抽象类完成主体流程并提供抽象方法,子类只需完成抽象方法即可。