resteasy-spring,resteasy-spring-boot和resteasy的servlet容器差别
「resteasy-spring」,「resteasy-spring-boot」和「resteasy standalone」的加载过程是各自独立的。总结如下:
- 「resteasy-spring」使用
springmvc-resteasy.xml
进行容器的初始化与加载,而springmvc-resteasy.xml
会配置处理每次请求的class为ResteasyHandlerAdapter
。 - 「resteasy-spring-boot」使用自己的
ResteasyAutoConfiguration
和一系列的classes进行容器的加载。 - 「resteasy standalone」使用
HttpServletDispatcher
或者FilterDispatcher
进行容器的加载,它们两个共同使用底层的ServletContainerDispatcher
。
虽然上面三种环境下容器的加载机制不同,但是它们的逻辑是共通的,下面逐一分析,通过详细的分析可以看到这点。
resteasy-spring
「resteasy-spring」使用的是springmvc-resteasy.xml
进行的容器配置:
里面的核心包括:
ResteasyDeployment
Registry
Dispatcher
ProviderFactory
这些是resteasy里面通用的基础组件。接下来是resteasy-spring
自己特定的组件,分别是:
SpringBeanProcessor
ResteasyHandlerAdapter
其中SpringBeanProcessor
负责初始化上面的四个核心组件,而ResteasyHandlerAdapter
负责处理每次的实际请求。
下面是resteasy-spring
的整体设计:
具体看下SpringBeanProcessor
:
如上图所示,这里面有一个「inner class」叫做ResteasyBeanPostProcessor
,把它提取出来,看看里面的核心逻辑,就是postProcessAfterInitialization()
这个方法:
我们可以看到对ResteasyDeployment
这个核心组件的加载,也就是调用它的start()
方法。具体到处理每一次请求,使用的是ResteasyHandlerAdapter
:
具体处理请求的是里面的handle()
方法:
resteasy-spring-boot
「resteasy-spring-boot」使用ResteasyAutoConfiguration
:
在ResteasyAutoConfiguration
里面,核心的配置流程是resteasyBootstrapListener()
这里,这里面初始化了一个ServletContextListener
,我把它给拆出来,看下具体的逻辑:
从上面也可以看到对ResteasyDeployment.start()
的调用。
resteasy standalone
「resteasy」独立使用,并且被部署到「servlet」容器里面去。HttpServletDispatcher
和FilterDispatcher
都包含ServletContainerDispatcher
:
所以核心是ServletContainerDispatcher
。下面是ServletContainerDispatcher.init()
的加载逻辑:
从上面的时序图里同样可以看到ResteasyDeployment.start()
的逻辑。针对每个具体服务,走的是ServletContainerDispatcher.service()
方法:
以上是针对resteasy的resteasy-spring,resteasy-spring-boot和resteasy的servlet容器的分析。