2012-04-13 5 views
0

はの文「All Rocks have Minerals.」にしてみましょう:それらのそれぞれが異なるMineralインスタンスで構成され、我々は2つのRockインスタンスをしたい場合はGuiceの:インスタンスを要求し、ないタイプ

public class Mineral 
{ 
    // Nevermind why a Mineral would have a GUID. 
    // This is just to show that each Mineral instance 
    // is universally-unique. 
    String guid; 

    @Inject 
    public Mineral(String id) 
    { 
     guid = id; 
    } 
} 

public class Rock 
{ 
    private Mineral mineral; 

    @Inject 
    public Rock(Mineral min) 
    { 
     mineral = min; 
    } 
} 

を(自分自身のGUIDを持つ各):

私たちは Rock用のGuiceを頼むとき
public class RockModule extends AbstractModule 
{ 
    public void configure(Binder binder) 
    { 
     // Make two Minerals with different GUIDs. 
     Mineral M1 = new Mineral(UUID.getRandomId().toString()); 
     Mineral M2 = new Mineral(UUID.getRandomId().toString()); 

     // Configure two Rocks with these unique Minerals 
     Rock R1 = new Rock(M1); 
     Rock R2 = new Rock(M2); 

     // Define bindings 
     bind(Rock.class).toInstance(R1); 

     // No way for Guice to expose R2 to the outside world! 
    } 
} 

はだから今、それは常に私たち自身がのM1インスタンスで構成されR1インスタンスを与えます。

Spring DIでは、2つのBeanを同じタイプに定義できますが、異なるBean IDを与えるだけです。次に、IDを使ってBeanを一緒に「配線」します。だから私はR1M1と一緒にR1M2などを配線することができました。そして、私はそれらを必要とするので、春にR1またはR2を頼むことができます。 Guiceので

、あなただけのあなたが欲しいタイプ(Rock.class)、ないインスタンスを求めることができます。

どのようにGuiceでさまざまな「有線豆」をリクエストしますか?異なるAbstractModuleのコンクリートを使用することによって?それともGuiceの限界ですか?

答えて

1

一般的に、これはGuiceの勧告に違反します。最初にDIコンテナを使用する目的を無効にするため、通常はnewというモジュールをインスタンス内に作成することはありません。 (なぜ、@Injectであなたのクラスに注釈を付ける?)

むしろ、あなたはGuiceのはあなたのためにこれをやらせたい:

class RockModule extends AbstractModule { 
    public void configure() {} 

    @Provides 
    @Named("UUID") 
    public String getUuid() { 
    return UUID.getRandomId().toString(); 
    } 
} 

は今、各Mineralは自動的にユニークなUUIDを取得し、各RockはユニークMineralを取得します。

これは私たちに一部の方法を取得しますが、あなたは、実行時に使用するために石や鉱物の2つの固有のペアリングをしたい場合は、これはGuiceのは「ロボットの足」問題を呼んで、そしてあなたがプライベートモジュールを使用してそれを解決することができます。例hereを参照してください。

1

私はあなたがほしいと思うと思うbinding annotations。 Guiceはタイプでバインドしません - キーでバインドしますが、何もしない場合、キーはタイプのみで構成されます。バインディングアノテーションを使用すると、豊富なキーを作成できます。

リンクドキュメントは、より良い私ができるよりもそれを説明するが、結果には、あなたが望むものを指定するさまざまな方法があるということです。

@Inject 
public Foo(@Named("X") Rock rock) 

または

@Inject 
public Foo(@HardRockCafe Rock rock) 

後者で

ケースの場合、 @HardRockCafeはカスタムバインディングアノテーションです。

+0

@herpylderp:まあ、それはあなたが「正確に」意味することに依存しますが、基本的には「はい」です。 –

関連する問題