对RESTEasy当中Context和Registry的分析
现在的思路是把AbstractReaderInterceptorContext这条线看清楚。看它的process(…)
方法,在这里加入tracing info。下面是context相关的classes:
上面的classes共同实现的是javax.ws.rs.ext.InterceptorContext
接口。这个接口是JAX-RS的spec标准,而各种registry classes则是RESTEasy自己的实现。
Registry的相关classes
registry classes的实现在这里:
接下来要搞清楚registry和context之间的调用关系,总之最终目的是得到匹配的interceptor。下面是所有registries的实现:
那么registry和context之间有什么联系呢?从类图的分析来看,registry像是用来匹配interceptors,而context则是用来使用interceptors。
目前的分析来看,registry应该是RESTEasy自己实现的一个机制,和context这边的设计是相互独立的,没什么用,可以先放放,不管这些registries。
TODO:具体还要更深入的分析
context主要看proceed(...)
方法,举例AbstractReaderInterceptorContext
:
关键是找到处理request的整个入口位置,然后找到response的出口位置。一些线索:
ServerResponseWriter
ResourceMethodInvoker
下面是ResourceMethodInvoker
以及相关的class diagram:
从上面的图可以看出几件事儿:
ResourceMethodInvoker
使用的是PostMatchContainerRequestContext
。- 这些落到最终实现的context classes,它们都包含有
HttpRequest
。 - 包含
ResteasyProviderFactory
的,是reader context和writer context。
所以我们需要理清哪一个context被谁使用的问题。下面是一些分析结果:
ServerWriterInterceptorContext
被ServerResponseWriter
所使用,而ServerResponseWriter
被SynchronousDispatcher
所使用。ServerReaderInterceptorContext
被MessageBodyParameterInjector
所使用。
以上是对RESTEsay的registry和contexts的分析。