RESTEasy的Path Matching的相关Classes
本文分析RESTEasy中,从请求路径匹配到实际资源的核心classes设计。下面是相关的classes:

Nodes之间的层级是这样的:
RootClassNode -> ClassNode <-> ClassExpression <-> RootNode -> SegmentNode <-> MethodExpression -> ResourceInvoker
所有这些Nodes都有match()方法,除了ClassNode的match()方法返回类型是RootNode以外,其它类型nodes的返回类型都是ResourceInvoker。
以下是RootClassNode的match()方法:
.cb8584903b7e48c3a3272921bea0df22.jpg)
可以看到它调用自己包含的,类行为ClassNode,名字为root的实例的match()方法。在root的match()方法调用后,得到类型为RootNode的object;然后再用类型为RootNode的object的match()方法,得到ResourceInvoker的实例。
接下来具体看看ClassNode的match()方法:
.5a7552a0c889410383cb4d77b975bb66.jpg)
可以看到ClassNode是如何匹配到RootNode的全过程。可以在这个过程当中,ClassExpression的调用情况。
接下来是RootNode的match()方法调用情况:
.7e02729c8f7f4918ae101d46722f06a3.jpg)
可以看到RootNode的match()方法就是调用自己包含的,类型为SegmentNode,名字为root的实例的match()方法。
最后看SegmentNode的match()方法:
.e6ce97ba213a4fc1ad157bcb852f5c84.jpg)
上面是通过SegmentNode实际匹配到ResourceInvoker的全过程,注意这里面对MethodExpression的使用。
整个上面的流程,在ResourceMethodRegistry的入口是getResourceInvoker()方法:
.bdc7407173ec43db9da8315d7fef42f7.jpg)
可以看到整个匹配路径的入口,根据是否为widerMatching的条件的不同,要么是RootNode,要么是RootClassNode。
总结一些要点:
RootClassNode,ClassNode代表着对class的匹配。RootNode,SegmentNode代表着对method的匹配。ClassNode和SegmentNode都包含着具体的匹配过程。- 最终目的是得到正确的
ResourceInvoker。 ClassExpression被用在ClassNode里。MethodExpression被用在SegmentNode里。
以上是一些简单的分析,具体的匹配过程在这篇文章里先不展开分析了,找机会单开一篇文章来写。
- 上一篇 什么是Segment fault
- 下一篇 搞懂C语言里面的函数指针