天天看点

Spring MVC - HandlerMapping思路分析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

继承该类,重写了

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

总结

通过抽象类完成主体流程并提供抽象方法,子类只需完成抽象方法即可。

继续阅读