Java 何时使用Jersey的@Singleton注释?

Java 何时使用Jersey的@Singleton注释?,java,rest,jersey,Java,Rest,Jersey,我正在开发一个RESTful Web服务,在阅读Jersey时,我发现了一个注释@Singleton 在我的web服务中,我主要基于作为参数提供的唯一键返回数据。 一个类比是当学生Id通过时返回学生的所有信息 所以我的问题是,@Singleton什么时候适合这种Web服务 根据@RequestScoped 如果在请求处理中多次使用该资源,则将始终使用同一实例 那么在这种情况下,我们不应该费心使用@Singleton对吗 还有,我们必须为每个请求创建一个新实例的用例是什么 我确实看过帖子,但我的问

我正在开发一个RESTful Web服务,在阅读Jersey时,我发现了一个注释
@Singleton

在我的web服务中,我主要基于作为参数提供的唯一键返回数据。 一个类比是当学生Id通过时返回学生的所有信息

所以我的问题是,
@Singleton
什么时候适合这种Web服务

根据
@RequestScoped

如果在请求处理中多次使用该资源,则将始终使用同一实例

那么在这种情况下,我们不应该费心使用
@Singleton
对吗

还有,我们必须为每个请求创建一个新实例的用例是什么


我确实看过帖子,但我的问题没有得到回答。

默认情况下,Jersey会为每个请求创建资源类的新实例。因此,如果不注释Jersey资源类,它将隐式使用
@requestscope
范围。其内容如下:

默认生命周期(不存在注释时应用)。在这个 范围为每个新请求创建并使用资源实例 用于处理此请求。如果资源被多个用户使用 在请求处理过程中,始终使用相同的实例。 当一个资源是子资源并且返回的次数更多时,就会发生这种情况 在配对过程中重复了三次。在这种情况下,只有在实例上才会出现 为请求提供服务器

大多数情况下,您使用此默认设置,因此不使用
@Singleton
范围。您还可以使用
@singleton
注释创建singleton Jersey资源类。然后您需要在
MyApplication
类中注册singleton类,例如

@Path("/resource")
@Singleton
public class JerseySingletonClass {
    //methods ...
}

public class MyApplication extends ResourceConfig {

    /*Register JAX-RS application components.*/
    public MyApplication () {
        register(JerseySingletonClass.class);
    }
}

在大多数情况下,默认范围
@RequestScoped
应该足以满足您的需要


@Singleton
可以保持状态。当我的端点被注释为
@Singleton
时,我遇到了问题,因此它在并发调用期间重用了相同的
EntityManager
。删除
@Singleton
后,在并发调用期间,将使用不同的
EntityManager
对象实例。如果端点调用是后续的,则可能会使用以前的/old
EntityManager
。-

Jersey 2手册中实际指定了一个用例,用于在服务器发送事件时使用

广播资源类用@Singleton注释,它告诉Jersey runtime,只有资源类的一个实例应用于服务到/广播路径的所有传入请求。这是必需的,因为我们希望在应用程序范围内保持对私有广播者字段的单一引用,以便我们可以对所有请求使用相同的实例。要侦听SSE事件的客户端首先向广播资源发送GET请求,该请求由listenToBroadcast()资源方法处理

使用
@Singleton
,对于所有传入的请求,应用程序将只包含一个
SSETrabitor
,一个这样的广播器足以服务多个客户端,因此只需要实例化一次

JAX-RS SSE API定义了SSE广播器,它允许向多个客户端广播单个事件


出现这个问题是因为我第一次有了一个不使用@Singleton注释的用例

Singleton是一种设计模式,您应该在以下情况下使用它:

  • 正在“单音化”的对象保持一个必须共享并保持唯一的状态(例如:全局计数器)
  • 通常,我在设计RESTAPI时没有保留状态,一切都是在方法中处理的(完全闭包):因此,通常我所有的资源都是单例的(用例:更好的性能)
这就是说,今天我发现了不使用Singleton的用例:

@Path("/someendpoint/{pathparam}/somethingelse/")
//@Singleton
public class MyResource {
    @PathParam("pathparam")
    private String pathparam;
}
使用这个函数,我将path参数绑定到我的实例,因此它必须是requestscope。 通常,我会在每个方法中都添加@PathParam注释,因此@Singleton应该在类中是正确的


我不确定性能如何,但是,创建和销毁对象并不是一个免费的操作

@Singleton完成了任务:)+1这并不能回答问题。什么时候使用@Singleton,有什么用例吗?我很好奇它将如何处理并发请求。如果在第一个请求之前出现另一个请求,多个线程将被分叉。如果是,那么并发是否需要手动处理?