2016-11-09 71 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',惟命是从。关键的“一致”可以是任何事情,只要你对此一致。 :) –