2016-11-09 72 views
1

假設有A類即的構造看起來就像這樣:吉斯 - 具有約束力的輔助注塑工廠創建一個實例

public A(@Assited long id, @Assisten String name, ServiceA serviceA, ServiceB serviceB) 

還有的AFactory:

public interface AFactory{ 

    A create(long id, String name); 
} 

所以創建的實例AI顯然需要這樣做:

​​

但是, 比方說,我有其他類:B類,C類和具有與類型A的成員,例如(具有場注入,但可以構造函數也)類d:

public class B{ 
     @Inject 
     A a; 
    } 

我想的是,A的相同實例將被注入到這些類中。 但是仍然可以選擇將其他類的另一個實例注入其他類(比如E類和F類)。

這樣做的正確方法是什麼? 我只是想不出一個乾淨的方式來做到這一點。

回答

0

您可以將模塊構造爲使用提供者(我使用下面的@Provides方法,但如果您願意,可以使用完整的提供者類或實例),並將一致的A標記爲@Singleton。如果你想要兩個A的綁定(一致的和不一致的),至少應該爲其中一個綁定標註一個綁定註釋;我在這裏出於方便使用@Named,但您可以使用列出的任何綁定註釋in the docs

public class AModule extends AbstractModule { 
    @Override public void configure() { 
    // Install your AFactory module. Here, injections for AFactory should succeed. 
    install(new FactoryModuleBuilder().build(AFactory.class)); 
    } 

    /** 
    * Provides a singleton @Named("consistent") A. 
    * Inject @Named("consistent") A into B, C, and D; Guice will cache the instance. 
    */ 
    @Provides @Singleton @Named("consistent") 
     A provideConsistentA(AFactory factory) { 
    return factory.create(100, "mike"); 
    } 

    /** 
    * Provides an unscoped A. 
    * Inject A without an annotation into E and F; each instance will be separate. 
    */ 
    @Provides @Singleton A provideUnscopedA(AFactory factory) { 
    return factory.create(200, "jeff"); 
    } 
} 
+0

所以,如果我只是在E類的字段如下: @Inject @Named( 「一致」) – slashms

+0

'@Inject @Named( 「一致」)一個fieldName',惟命是從。關鍵的「一致」可以是任何事情,只要你對此一致。 :) –