Java rest api中的资源实例

Posted

技术标签:

【中文标题】Java rest api中的资源实例【英文标题】:Instance of resource in Java rest api 【发布时间】:2012-08-17 01:13:59 【问题描述】:

我有一个 java rest api。我想知道的是:

假设一个特定的客户端(例如,名为 X 的人正在使用计算机 Y)对同一个 uri 进行了三个调用。 (例如https://***.com/firstname/kasav/lastname/bere)。此外,假设资源有一个非静态计数器。

class ResourceA
     int count = 0;

     @Get
     public Response service()
        count++;
        //return count below
     

现在调用者是否对所有三个调用都得到相同的响应:

1

或者,呼叫者是否在第一次呼叫时获得1,然后在第二次呼叫时获得2,然后在第三次呼叫时获得3

对你们中的一些人来说,这可能是显而易见的,但对我来说不是。感谢您的帮助。

【问题讨论】:

【参考方案1】:

假设您使用的是正确遵循 JAX-RS 规范的东西。

3.1.1 生命周期与环境

默认情况下,会为对该资源的每个请求创建一个新的资源类实例。首先是 构造函数(见第 3.1.2 节)被调用,然后任何请求 依赖项被注入(见第 3.2 节),然后适当的 方法(见 3.3 节)被调用,最后对象被创建 可用于垃圾收集。一个实现可以提供其他的 资源类生命周期,指定这些的机制在外部 本规范的范围。例如。基于一个实现 控制反转框架可能支持所有生命周期 该框架提供的选项。

因此,您的问题的答案是所有呼叫者都会收到1,因为每个请求都会启动课程。

有关 JAX-RS 规范,请参阅 JSR-311。

【讨论】:

我做了一些研究来确认你的答案,但我不能。您基本上是说为每次调用创建一个对象。如果我有一百万用户怎么办?这似乎效率低下。 如果资源类没有我的示例中的构造函数怎么办。每个用户是否仍然看到0 我只能说规范。您遗漏了正在运行的容器以及更多信息。【参考方案2】:

默认情况下,JAX RS 资源是请求范围的,这意味着它为每个请求创建新实例。

要使用同一资源实例处理多个请求,您可以使用注释 @Singleton 标记资源(在本例中为 ResourceA 类)。 标记为 Singleton 将使 ResourceA 类的输出为第一个请求为 1,第二个请求为 2,依此类推。

【讨论】:

以上是关于Java rest api中的资源实例的主要内容,如果未能解决你的问题,请参考以下文章

基于替代标识符获取rest API中的资源

RESTful Web API中的Http协议语义

RESTful Web API中的Http协议语义

RESTful Web API中的Http协议语义

RESTful Web API中的Http协议语义

Django REST Framework 中的嵌套资源