2017-01-16 6 views
3

私は自分のGuiceのモジュールをしましたし、configureメソッドでは、私は下のように私自身のバインディングを提供してきました -Guice Moduleに新しいバインディングを追加しますか?

public void configure() { 
    MapBinder<String, ExternalDatabaseConnection> m = MapBinder.newMapBinder(binder(), String.class, ExternalDatabaseConnection.class); 
    m.addBinding("DBServer1").to(ExternalDBServer1Connection.class); 
    m.addBinding("DBServer2").to(ExternalDBServer2Connection.class); 
} 

は、上記のWebアプリケーションとして展開されています。 私は、サードパーティプロバイダが独自の実装を提供し、接続クラス用のjarファイルを提供できるようにしたいと考えています。それ、どうやったら出来るの?上記のコードを変更して、以下のような新しいバインディングを追加する代わりに -

m.addBinding("DBServer3").to(ExternalDBServer3Connection.class); 
+0

サードパーティのコードでは、モジュールをインストールしてから 'MapBinder'を使用するだけで、これを行うことができます。 –

答えて

3

モジュールを組み合わせることができます。ここに例があります。たとえば、エクステンションと内部モジュールが別々に存在するとしましょう。

public class InternalModule extends AbstractModule { 

    @Override 
    protected void configure() { 
     MapBinder<String, String> m = MapBinder.newMapBinder(binder(), String.class, String.class); 
     m.addBinding("DBServer1").toInstance("Value1"); 
     m.addBinding("DBServer2").toInstance("Value2"); 
    } 

} 

と:ここ

public class ExternalModule extends AbstractModule { 

    @Override 
    protected void configure() { 
     MapBinder<String, String> m = MapBinder.newMapBinder(binder(), String.class, String.class); 
     m.addBinding("DBServer3").toInstance("Value3"); 
    } 

} 

2つのモジュールの組み合わせに基づいてインジェクタ(例えば、このアプリに住んでも、あなたはいくつかの簡単な登録メカニズムを実装することができる)である。

InternalModule moduleInt = new InternalModule(); 
ExternalModule moduleExt = new ExternalModule(); 

Module combined = Modules.combine(moduleInt, moduleExt); 

Injector injector = Guice.createInjector(combined); 
このインジェクタはマップを注入

、例えば:

@Inject 
private Map<String, String> stringMap; 

このマップは、以下の値が含まれます:

{DBServer1=Value1, DBServer2=Value2, DBServer3=Value3} 

Javadoc of Modulesを。

モジュールを組み合わせずにオーバーライドすることもできます。この場合、外部ライブラリはあなた自身の実装を置き換えます。

これが役に立ちます。

関連する問題