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中的资源实例的主要内容,如果未能解决你的问题,请参考以下文章