2012-02-24 238 views
3

我不知道什麼範圍如下因素兩個綁定有:GIN綁定的範圍是什麼?

bind(PermissionManager.class).in(Singleton.class); 

bind(PermissionManager.class); 

我已閱讀JavaDoc中,他們表現如下。對於辛格爾頓:

/** 
* Apply this to implementation classes when you want only one instance 
* (per {@link Injector}) to be reused for all injections for that binding. 
* 
* @author [email protected] (Bob Lee) 
*/ 

對於無範圍:

/** 
* No scope; the same as not applying any scope at all. Each time the 
* Injector obtains an instance of an object with "no scope", it injects this 
* instance then immediately forgets it. When the next request for the same 
* binding arrives it will need to obtain the instance over again. 
* 
* <p>This exists only in case a class has been annotated with a scope 
* annotation such as {@link Singleton @Singleton}, and you need to override 
* this to "no scope" in your binding. 
* 
* @since 2.0 
*/ 

這是什麼意思在實用性方面?每個客戶端或每個JVM都是單身人士嗎?對於沒有範圍,每個實例都不同?

回答

3

實際上,對於杜松子酒,Singleton作用域在每個客戶端實例或更準確地說,每個Ginjector實例考慮時最有意義。如果你錯誤地讓一個實例創建兩個Ginjectors兩次,那麼每個實例可能會有一個「singleton」,因爲每個Ginjector只能跟蹤它所管理的實例。

因此,每次加載應用程序時,它都會有自己的單例。如果用戶在兩個不同的選項卡中打開兩次相同的應用程序,則每個應用程序都有自己的單例。您可以將每個選項卡都視爲自己的JVM,因爲它將擁有自己的所有類的副本,並且無法在其他窗口上進行通信或調用方法*。

對於沒有範圍,是的,默認情況下,每個實例是不同的。當一個類型爲@Inject ed時,它將成爲一個新的實例,但如果您的字段爲@Inject a Provider,則每次調用get()時,都可以獲得一個新實例。這對於輕鬆獲得幾個新注入的實例可能會有所幫助。

單身有意義的兩種主要情況

  • 當實例保存共享一個需要跨越許多常見的注射用狀態 - 最常見的情況。
  • 當實例創建成本很高時 - 在服務器上這通常是作爲一個池來完成的,因此不會創建超過X個對象,但客戶端上的昂貴對象往往是視圖,有很多小部件,並且通常不止一個是不需要的。

*可以在另一個窗口調用方法,但是您需要使用瀏覽器的功能來發布消息,而不是僅僅來回傳遞對象。

+0

感謝您的解釋。所以在我的情況下,我有一個'PermissionManager',每個用戶都擁有權限。它們對於與用戶會話相關的所有注入應該是通用的(我不關心多個瀏覽器選項卡)。根據我的理解,「@ Singleton」是我需要的,對吧? – 2012-02-26 23:05:06

+0

如果它本身持有狀態(而不是從其他實例讀取),那麼很可能。您可能會發現使用'Provider'接口在實例準備就緒之前將其設置爲null是方便的,並且將該提供程序作爲單例綁定,但允許任何讀取perms的請求都要求該提供程序使用'PermissionManager'。 (如果這是在服務器上,你可以使用@SessionScoped來替代,而Guice會想出如何保持會話特定的。)有多種方法可以正確執行此操作,具體取決於具體情況,以及何時數據,它的有效時間。 – 2012-02-27 02:23:11

+0

哦,它在服務器上,不能相信我忘了提及這一點。看起來像'@ SessionScoped'就是我需要的。 – 2012-02-27 17:32:32

2

單件只由您創建的最高級別的注射器創建(對於大多數應用程序,您只創建一個注射器)。

每次將其注入爲另一個對象的依賴項時,都會創建未對比的對象。所以每個實例都會有所不同。如果您不打算對其進行限定(或者執行綁定程序DSL允許您執行綁定的任何其他操作),則實際上不需要編寫綁定(SomeClass.class)。只需使用默認構造函數或向構造函數添加@Inject就可以讓Gin創建它。

一般來說,當您使用Guice或杜松子酒時,您希望讓事情不受影響,除非您有充分的理由不這樣做。我會推薦閱讀Guice documentation about scopes