2010-03-17 18 views
4

這似乎是一個奇怪的問題(答案顯然會生產,杜),但是如果你閱讀Java文檔:在應用程序服務器中用於Google Guice的正確生產階段是什麼?

/** 
    * We want fast startup times at the expense of runtime performance and some up front error 
* checking. 
*/ 
DEVELOPMENT, 

/** 
* We want to catch errors as early as possible and take performance hits up front. 
*/ 
PRODUCTION 

假設,你必須在應用程序服務器的無狀態呼叫的情況下,最初的接收信號方法(或那裏)爲每個呼叫創建新的噴油器。如果在給定的調用中不需要所有模塊綁定,那麼使用開發階段(這是默認設置)似乎更好,並且不會提前展現性能,因爲您可能永遠不會採用它,這裏「前期」和「運行時間性能」之間的區別是沒有意義的,因爲它是一次調用。

當然,這樣做的缺點似乎是您將失去錯誤檢查功能,從而導致潛在的代碼路徑出現意外導致問題。

所以問題歸結爲上述正確的假設?當噴射器的給定壽命是一次呼叫時,您是否可以節省大量模塊的性能?

+1

是否正在爲每一個請求創建一個新的注入器,真的是你想要做的?這不是我們如何做(模子注射器)。 – 2010-03-17 22:30:15

+0

@凱文,我很樂意聽到更好的選擇。請注意,注入器具有一段狀態(通過呼叫傳遞的認證令牌),每次呼叫都必須有所不同,因此僅將它存儲在靜態中不是一種選擇。雖然我知道兒童注射器存在,但我從未考慮過他們能爲我做些什麼。 – Yishai 2010-03-17 22:40:34

+0

考慮輔助注射?或者也許是帶種子值的SimpleScope? http://code.google.com/p/google-guice/wiki/CustomScopes – 2010-03-18 00:57:25

回答

4

應該沒有必要爲每個請求創建一個注入器。這並不是真正意義上的Guice意圖 - 每個應用程序只需要一個Injector。噴油器實際上代表了應用程序的配置或接線,而不是短暫的狀態。我想你需要看看使用Guice Scopes

GuiceServlet爲您提供了@RequestScoped,它允許您將對象的生存期限制爲HTTP請求,這聽起來像您想要做的事情。

如果你不在Servlet中,你可以隨時定義你自己的custom scope。這不是很複雜。

+0

感謝蒂姆,但不是像@RequestScoped那樣的範圍,就像每次創建注入器一樣?無論如何,我解決的解決方案是創建一個兒童注射器,並確實將注射器保持靜態。不確定這是否真的是100%的EJB規範,但它是有效的。 – Yishai 2012-02-03 17:19:23

+0

以有限的方式,是的。但是使用子噴射器來控制範圍將會限制你的其他方面: 1.你將不能混合任何其他範圍,因此子噴射器中的任何@Singleton實體將被丟棄。 2.您將在每個請求中創建噴油器的所有開銷,這可能很重要。使用單一噴油器的一部分就是預先完成所有的裝訂工作。 – 2012-02-06 11:48:17

相關問題