深入剖析Spring Web源码(十一) - 处理器映射,处理器适配器以及处理器的实现 - 处理器映射的实现架构

 

2.2.2.1 处理器映射的实现架构

 

作为总控制器的派遣器Servlet首先会轮询处理器映射模块,查找能够处理当前请求的处理器,处理器映射模块根据当前请求的URL返回简单的控制器类型,注解控制器类型或者远程调用处理器类型。前一小节中,我们根据流程的实现分析了BeanURL处理器映射(BeanNameUrlHandlerMapping)和缺省注解处理器映射(DefaultAnnotationHandlerMapping)。事实上,在处理器映射的实现体系结构中还有其他的实现,用来实现根据不同的规则查找相应的处理器的逻辑。不同层次的处理器映射的实现,无论是抽象类还是实现类,都关联着特殊而又完整的逻辑。如下类图所示,

 

 

图表 429

 

上一节流程分析中讨论的BeanURL处理器映射(BeanNameUrlHandlerMapping)和缺省注解处理器映射(DefaultAnnotationHandlerMapping),他们是经常使用到的处理器映射的实现,下面我们介绍所有的处理器映射的具体实现类的逻辑功能。

 

l         BeanURL处理器映射(BeanNameUrlHandlerMapping)

 

这个实现类通过识别Web应用程序环境中以URL为名字声明的Bean为处理器。URL是通过以斜线(/)开头的并且以斜线(/)分隔的字符串。然后,使用Bean名中声明的URL和请求的URL进行匹配,如果匹配成功,则使用匹配的Bean作为处理器返回。

 

l         缺省注解处理器映射(DefaultAnnotationHandlerMapping)

 

这个实现类通过声明在Web应用程序环境中Bean类型中的请求映射注解(@RequestMapping)来注册处理器映射的。请求映射注解声明有匹配请求URL所用的URL Pattern。然后,使用方法级别的请求映射注解中声明的URL Pattern和类型级别的请求映射注解中声明的URL Pattern结合并且匹配请求的URL,如果匹配成功,则使用匹配的Bean作为处理器返回。

 

l         控制器类名处理器映射(ControllerClassNameHandlerMapping)

 

这个实现类通过声明在Web应用程序环境中的控制器类型来注册处理器映射的。它从控制器的类型转换出控制器所服务的URL Pattern。这个转换规则是,把点号分割的具有包前缀的类名替换成斜线(/)分割的具有包前缀的字符串,再加上前缀和后缀构成URL Pattern,然后,使用得到的Pattern匹配请求的URL,如果匹配成功,则使用匹配的Bean作为处理器返回。

 

l         控制器Bean名处理器映射(ControllerBeanNameHandlerMapping)

 

这个实现类通过声明在Web应用程序环境中的控制器类型来注册处理器映射的。它从控制器的Bean名字转换出控制器所服务的URL Pattern。这个转换规则是,把Bean名字加上前缀和后缀构成URL Pattern,然后,使用得到的Pattern匹配请求的URL,如果匹配成功,则使用匹配的Bean作为处理器返回。

 

l         简单URL处理器映射(SimpleUrlHandlerMapping)

 

这个实现类通过配置一套URL Pattern到处理器的映射而实现的。它使用配置的映射中的URL Pattern匹配请求中的URL,如果匹配成功,则使用匹配URL Pattern映射的Bean作为处理器返回。

 

我们看到具体的实现类并不是直接实现处理器映射接口的,而是通过一系列的抽象类的实现最终完成的,在每个抽象类的实现层次上完成不同的独立的逻辑功能。下面我们分析这些抽象类和实现他们的具体实现类是如何分工并且最终完成必要的业务逻辑的。

 

l         抽象处理器映射(AbstractHandlerMapping)

 

抽象处理器映射是处理器映射实现中的最底层的实现,它直接实现处理器映射接口,并且继承Web应用程序环境支持对象。它提供了配置缺省处理器以及应用到所有处理器上的处理器拦截器的功能。

 

它把具体如何取得一个处理器抽象并且留给子类进行特殊化的实现。

 

l         抽象URL处理器映射(AbstractUrlHandlerMapping)

 

抽象URL处理器映射继承自抽象处理器映射,实现了取得一个处理器的抽象方法,提供了功能根据URL进行匹配处理器的功能。也提供了根据URL查找应用在处理器上特殊的拦截器。并且提供了方法实现注册URL到处理器的映射。

 

如何获得URL到处理器的映射的逻辑留给子类进行完成。

 

简单URL处理器映射就是通过应用程序环境中Bean串联配置直接注射URL到处理器映射来实现抽象URL处理器映射的。

 

l         抽象探测URL处理器映射(AbstractDetectingUrlHandlerMapping)

 

抽象探测URL处理器映射通过一定的规则在Web应用程序环境中自动发现URL到处理器的映射。

 

使用什么样的规则在Web应用程序环境中自动发现URL到处理器的映射并没有直接实现,因为这会有很多的映射规则,并且根据需求可以自由扩展。这个规则留给子类进行实现。

 

BeanURL处理器映射就是根据把Bean名声明作为URL来发现处理器的。而缺省注解处理器映射是根据声明在控制器中的请求映射注解中包含的URL Pattern信息来解析处理器的。

 

l         抽象控制器URL处理器映射(AbstractControllerUrlHandlerMapping)

 

这是抽象探测URL处理器映射的另外一个实现,这个实现也是一个抽象的实现,它是通过在Bean环境中找到合适的控制器类型,根据一定的规则将控制器类型映射到一个或者多个URL Pattern来实现的。

 

它有两个具体的实现类,控制器类名处理器映射是根据类名解析出映射的URL Pattern。而控制器Bean名处理器映射则是根据控制器在Web应用程序环境中声明的Bean名映射到URL Pattern的。

 

在上一节的分析中,我们已经对BeanURL处理器映射(BeanNameUrlHandlerMapping)和缺省注解处理器映射(DefaultAnnotationHandlerMapping)以及他们的父类进行分析。下面我们将对剩余的其他的类进行代码分析,首先回顾一下抽象探测URL处理器映射的实现,如下代码注释,

 

 

它留下了一个抽象方法,对于Web应用程序环境中的每一个Bean,都将使用此方法找到Bean所映射到的URL Pattern。子类需要根据具体的映射规则来实现这个方法。除了上一节中分析的BeanURL处理器映射和缺省注解处理器映射实现了这个方法外,存在另外一套根据控制器类型映射的实现。这套根据控制器类型映射的实现包含一个抽象实现和两个具体实现,抽象实现是抽象控制器处理器映射。如下代码所示,

 

  

抽象控制器处理器映射有两个实现,一个是根据Bean名字映射到URL Pattern的实现,另外一个是根据Bean的类型映射到URL Pattern的实现。

 

以下是控制器Bean名处理器映射(ControllerBeanNameHandlerMapping)的代码注释,

 

 

以下是控制器类名处理器映射(ControllerClassNameHandlerMapping)的代码注释,

 

 

抽象URL处理器映射有另外一个具体实现简单URL处理器映射,它根据配置的URL Pattern到处理器的映射来查找处理器,如下代码所示,

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值