[英]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.