2012-08-17 71 views
1

我有一个java rest api。我想知道的是:Java rest api中的资源实例

说一个特定的客户端(例如,名为X的人使用计算机Y)对同一个uri进行三次调用。 (例如https://stackoverflow.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

我做了一些研究,试图确认你的答案,我不能。你基本上是说每个呼叫都创建一个对象。如果我有一百万用户呢?这似乎效率低下。 – kasavbere 2012-08-18 02:01:38

+0

如果资源类没有构造函数,那么该怎么办?每个用户是否仍然看到'0'? – kasavbere 2012-08-18 02:05:25

+0

我只能说规范。您已经遗漏了您正在运行的容器以及更多信息。 – Krrose27 2012-08-18 20:14:13

1

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

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