2017-01-16 23 views
3

Я свой собственный модуль Guice и в методе конфигурирования, я предоставил свои собственные привязок, как под -Добавить новую привязку к модулю Guice?

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); 
} 

выше развернут как веб-приложение. Я хочу, чтобы сторонние поставщики могли предоставить там собственные реализации и предоставить файл jar для класса подключения. Как мне это сделать? Это вместо того, чтобы модифицировать код выше, чтобы добавить новое связывание, как показано ниже -

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

Сторонний код уже может это сделать, просто установив модуль, а затем используя сами «MapBinder». –

ответ

3

Вы можете комбинировать модули. Вот пример. Допустим, у вас есть extenral и внутренние модули, которые живут отдельно.

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"); 
    } 

} 

Вот инжектор на основе комбинации двух модулей (например, это может жить в вашем приложении, и вы можете реализовать некоторый простой механизм регистрации):

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.

Также возможно заменить модули вместо их объединения. В этом случае внешние библиотеки заменят ваши собственные реализации.

Надеюсь, это поможет.