6

有些事情我不确定我是否理解正确,因此,我需要帮助:)

我见过这个:例子

@Path("/resource")
public class Resource {
    @Context
    private HttpHeaders headers;

    @GET
    public void get(@Context UriInfo uriInfo) {
       /* use headers or uriInfo variable here */
    }
}

这是否意味着对于每个请求,转换为“端点”的类会创建一个单独的线程?因为,否则,标题信息将不准确......

您能否指出一个(短:))资源,而不是 JAX-WS 规范,我可以在哪里找到有关此的信息?

4

1 回答 1

11

我想不出比JAX-RS 1.1 规范本身更短更直接的资源。很清楚你在问什么

JAX-RS 提供了用于获取和处理有关应用程序部署上下文和单个请求上下文的信息的工具。(...)

上下文特定于特定请求 (...)。

为了完整性,我可以补充一下:上下文信息是通过@Context注释获得的。至于资源,上下文信息仅对带有注释的那些@Path(也称为根资源)可用。此外,可以@Context注入以下上下文类型ApplicationUriInfoHttpHeadersRequest和.SecurityContextProviders

关于生命周期(请求/线程管理):

3.1.1 生命周期与环境

默认情况下,会为对该资源的每个请求创建一个的资源类实例 。首先调用构造函数,然后注入任何请求的依赖项(上下文是这些依赖项之一),然后调用适当的方法,最后使对象可用于垃圾回收。

一个实现可以提供其他资源类生命周期,指定这些生命周期的机制超出了本规范的范围。例如,基于控制反转框架的实现可以支持该框架提供的所有生命周期选项。

结论是:

  • 默认情况下,每个请求都由不同的资源实例处理;
  • 上下文是在请求时注入的(因此每个实例都有不同的上下文)。

每个特定的实现可能会稍微改变这个生命周期,但应该保持原则(每个请求特定的上下文)。

正如你所看到的,规范也没有提到线程管理。由于大多数 JAX-RS 实现都是基于 Servlet 的,我们可以肯定地假设每个请求实例都转到不同的线程 - 因为 servlet 容器是每个请求的线程。

于 2013-06-11T15:12:27.950 回答