何时使用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,它允许向多个客户端广播单个事件。