2011-04-13 36 views
1

我在想如何使用噴油器。我明白它主要用於啓動時,但是如何在運行時使用它來創建某個實現的對象?製作Guice Injector Singleton以保持一致性

例如,我有一個用戶UserA,UserB和UserC的實現接口。我在運行時使用Guice的想法是將它包裝在Singleton類中,以便我可以檢索它,而不是每次創建User對象的實例時都創建一個新的注入器。

//Create in singleton wrapper class 
Injector injector = Guice.createInjector(new SecurityModule()); 

//Retrieve and use at run-time (Manager is the singleton wrapper class) 
Injector injector = Manager.getInstance().getInjector(); 
User user = injector.getInstance(User.class); 

這是通常的做法嗎?基本上,我想確保我集中所有配置,以便減少錯誤(例如,使用錯誤的模塊)。這也更容易管理,所以如果我決定使用不同的配置模塊,我可以在類中修改它,而不是在每個使用它的Java類中修改它。

感謝, 傑克

回答

2

你不應該需要直接在應用程序中使用Injector除了在罕見和特殊情況下,甚至那麼你肯定不應該讓一個靜態的單例。如果您希望能夠在應用程序的某處使用Guice檢索User的新實例,則只需在需要時插入Provider<User>並調用get()即可。

1

我會寫:

public class Manager { 
    private static Manager instance; 
    // getInstance singleton method left out for brevity 
    private Injector injector; 
    private Manager() { 
     injector = Guice.createInjector(...); 
    } 
    public <T> T get(Class<? extends T> cls) { 
     return injector.getInstance(cls); 
    } 
} 

所以你可以做

Manager.getInstance().get(User.class),而不必使用注射器從吉斯,讓你改變依賴注入框架無需更改應用程序代碼。