簡體   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