何时使用Jersey的@Singleton注释?

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

在我的Web服务中,我主要根据作为参数提供的唯一键返回数据。 当Student_Id通过时,类比将返回学生的所有信息。

所以我的问题是@Singleton何时适合这种Web服务?

根据@RequestScoped文档

如果资源在请求处理中使用了多次,则始终使用相同的实例。

那么在那种情况下我们不应该费心去使用@Singleton吗?

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

我确实看过这篇文章,但我的问题没有得到解答。

默认情况下,Jersey为每个请求创建一个新的资源类实例。 因此,如果您不注释Jersey资源类,它会隐式使用@RequestScoped范围。 在Jersey文件中说明 :

默认生命周期(在没有注释时应用)。 在此范围内,为每个新请求创建资源实例,并用于处理此请求。 如果资源在请求处理中使用了多次,则始终使用相同的实例。 当资源是匹配期间多次返回的子资源时,可能会发生这种情况。 在这种情况下,只有实例才会为请求提供服务。

大多数情况下,您使用此默认设置,因此您不使用@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对象实例。 如果端点调用是后续的,则可能使用先前/旧的EntityManager 。 – Jersey,Guice和Hibernate – EntityManager线程安全

实际上,在Jersey 2手册中指定了在服务于Server-Sent事件时使用SseBroadcaster的用例, 在此提供的示例中对此进行了介绍

BroadcasterResource资源类使用@Singleton注释进行注释,该注释告诉Jersey运行时只应使用资源类的单个实例来为/广播路径提供所有传入请求。 这是必要的,因为我们希望保持对私有广播公司字段的应用程序范围的单一引用,以便我们可以对所有请求使用相同的实例。 想要侦听SSE事件的客户端首先向BroadcasterResource发送GET请求,该请求由listenToBroadcast()资源方法处理。

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

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