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
总结
通过抽象类完成主体流程并提供抽象方法,子类只需完成抽象方法即可。
本文深入解析HandlerMapping接口在Spring MVC框架中的角色与实现机制,探讨其模板方法模式的设计思路,及不同子类如AbstractUrlHandlerMapping、SimpleUrlHandlerMapping、AbstractDetectingUrlHandlerMapping和AbstractHandlerMethodMapping的具体应用。
191

被折叠的 条评论
为什么被折叠?



