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