[英]When to use @Singleton annotation of Jersey?
默认情况下,Jersey为每个请求创建资源类的新实例。 因此,如果您不注释Jersey资源类,它会隐式使用@RequestScoped
范围。 在Jersey文件中说明 :
默认生命周期(在没有注释时应用)。 在此范围内,为每个新请求创建资源实例,并用于处理此请求。 如果在请求处理中多次使用资源,则始终使用相同的实例。 当资源是匹配期间多次返回的子资源时,可能会发生这种情况。 在这种情况下,只有实例才会为请求提供服务。
大多数情况下,您使用此默认设置,因此您不使用@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);
}
}
提出这个问题,因为我第一次有一个不使用 @Singleton注释的用例。
Singleton是一种设计模式,如果符合以下条件,您应该使用它:
也就是说,今天我发现这个用例不使用Singleton:
@Path("/someendpoint/{pathparam}/somethingelse/")
//@Singleton
public class MyResource {
@PathParam("pathparam")
private String pathparam;
}
使用这个,我将路径参数绑定到我的实例,因此它必须是RequestScoped。 一般来说,我已经在每个方法中都放了@PathParam注释,所以@Singleton在这个类中是正确的。
然而,我不确定性能,创建和销毁对象不是免费操作
在大多数情况下,默认范围@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,它允许向多个客户端广播单个事件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.