2011-02-25 22 views
7

我明白使用構造函數注入而不是setter注入的好處,但在某些情況下,我必須堅持只使用基於setter的注入。我的問題是如何使用injector.injectMembers()方法注入所有基於setter的注入類的成員?Guice injectMembers方法

//I am calling this method in init method of my application 
private static final Injector injector = Guice.createInjector(new A(), new B()); 

//Injecting dependencies using setters of all classes bound in modules A and B 
injector.injectAllMembers()?? 
+1

你可以給出一個代碼用例的例子嗎? – 2011-02-25 11:58:39

+0

Guice已經做到了。你真的有問題嗎? – jabbie 2012-06-27 23:57:42

回答

10

爲什麼你需要手動注入依賴關係?

Guice自動將依賴關係注入字段和方法。 用途:

YourClass yourClass = injector.getInstance(YourClass.class); 

吉斯文件:

每當吉斯創建一個實例,它 執行該注射自動 (後第一次進行構造 注),所以如果你能夠讓 Guice爲你創建所有對象,你永遠不需要使用這種方法。

你需要注入自己的成員只有到手動創建的實例是這樣的:

YourClass yourClass = new YourClass(); 
injector.injectMembers(yourClass); 

或者你可以使用類似的東西:

public class YourClassProvider implements Provider<YourClass> { 

    private final Injector injector; 

    @Inject 
    public YourClassProvider(Injector injector) { 
     this.injector = injector; 
    } 

    public YourClass get() { 

     YourClass yourClass = new YourClass(); 
     injector.injectMembers(yourClass); 

     return yourClass; 
    } 
} 

在任何情況下,制定者YourClass應該用@Inject註釋。

+0

Coz Guice不創建這些類的實例,我使用Guice Provider從其他地方獲取這些類的實例。 – Abidi 2011-02-25 11:53:57

+0

請參閱最新答案中的代碼。希望它會有所幫助。 – Pavel 2011-02-25 12:11:56

+1

當你想要這樣做時,建議注入'MembersInjector ',而不是整個'Injector'。 – ColinD 2011-02-25 14:30:01