繁体   English   中英

何时使用Jersey的@Singleton注释?

[英]When to use @Singleton annotation of Jersey?

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

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

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

根据@RequestScoped文档

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

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

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

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

默认情况下,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是一种设计模式,如果符合以下条件,您应该使用它:

  • 您正在“单一化”的对象保持一个必须共享并保持唯一的状态(例如:全局计数器)
  • 通常,我设计REST API而不保持状态,一切都在方法中处理(完全关闭):所以我的所有资源通常都是单例(用例:更好的性能)

也就是说,今天我发现这个用例不使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM