阿男的小窝

View the Project on GitHub

resteasy-spring,resteasy-spring-boot和resteasy的servlet容器差别

「resteasy-spring」,「resteasy-spring-boot」和「resteasy standalone」的加载过程是各自独立的。总结如下:

虽然上面三种环境下容器的加载机制不同,但是它们的逻辑是共通的,下面逐一分析,通过详细的分析可以看到这点。

resteasy-spring

「resteasy-spring」使用的是springmvc-resteasy.xml进行的容器配置:

里面的核心包括:

这些是resteasy里面通用的基础组件。接下来是resteasy-spring自己特定的组件,分别是:

其中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」容器里面去。HttpServletDispatcherFilterDispatcher都包含ServletContainerDispatcher

所以核心是ServletContainerDispatcher。下面是ServletContainerDispatcher.init()的加载逻辑:

从上面的时序图里同样可以看到ResteasyDeployment.start()的逻辑。针对每个具体服务,走的是ServletContainerDispatcher.service()方法:

以上是针对resteasy的resteasy-spring,resteasy-spring-boot和resteasy的servlet容器的分析。