Guice

2016-11-09 8 views
1

이의 그 생성자가 같은 보이는 클래스 A가 있다고 가정 해 봅시다 보조 사출 공장에서 만든 인스턴스를 바인딩 :Guice

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

을 그리고 AFactory있다 :

public interface AFactory{ 

    A create(long id, String name); 
} 

그래서의 인스턴스를 생성 AI는 분명히 그런 일을 수행해야합니다

injector = Guice.createInjector(new MyModule()); 
AFactory af = injector.getInstance(AFactory .class); 
A a = AFactory.create(100, "mike"); 

하지만,클래스 B, 클래스 C와 (도의 ctor 필드 주입 만 가능) 예를 들어, A 형을 가진 멤버가 클래스 D : 0의 내가 다른 클래스가 있다고 가정 해 봅시다

public class B{ 
     @Inject 
     A a; 
    } 

을 그리고 내가 원하는 그 동일한 인스턴스이 해당 클래스에 주입됩니다. 그러나 A 클래스의 다른 인스턴스를 다른 클래스에 주입 할 수있는 옵션이 있습니다 (E 클래스와 F 클래스를 가정 해 봅시다).

올바른 방법은 무엇입니까? 나는 그렇게하기위한 깨끗한 방법을 생각할 수 없다.

답변

0

공급자를 사용하도록 모듈을 구성 할 수 있습니다 (아래 @Provides 메서드를 사용하지만 전체 공급자 클래스 또는 인스턴스를 사용할 수 있음). 일치하는 A를 @Singleton으로 표시합니다. A의 두 바인딩 (일관성 있고 불일치)을 원하면 적어도 하나는 바인딩 주석으로 표시해야합니다. 여기서는 편의상 @Named을 사용하고 있지만 in the docs과 같은 바인딩 어노테이션을 사용할 수 있습니다. 난 그냥 클래스 E에서 필드를 사용할 경우에

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

그래서 다음과 같이 @Inject @Named하는 fieldName' ("일관성") ("일관성") – slashms

+0

'@Inject @Named하지만 예를. 그리고 "일관된"핵심은 일관성있는 한 무엇이든 될 수 있습니다. :) –