2012-05-09 3 views
1

В моем проекте у меня есть файл конфигурации, в котором перечислены конкретные реализации интерфейса.Guice Укажите экземпляр на основе имени класса, считанного из файла

Как настроить мой модуль Guice, чтобы я мог получить экземпляр конкретного класса из Type всякий раз, когда вводится интерфейс?

interface A{} 

class AImpl implements A{ @Inject public A(.....)} 

class B { 
    @Inject 
    public B(A a) {} 
} 


class MyModule extends AbstractModule { 
    ... 
    @Provides 
    public A getA(@ConfiguredClass String classname) { 
    Class<A> aClass = (Class<A>) Class.forName(classname); 
    // ??? 
    // this needs to be instantiated by Guice to fulfill AImpl's dependencies 
    return aClass.newInstance(); 
    } 
} 

config: 
class: my.package.AImpl 

ответ

2

Вы можете прочитать в файле конфигурации во время запуска, преобразовать его в Map<Class, Class> и кормить отображение в модуль и настроить все привязки, как так:

public class MyModule extends AbstractMdoule{ 

    //interface -> concrete 
    Map<Class, Class> implementsMap; 
    ... 
    public void configure() { 
     for (Map.Entry<Class, Class> implEntry : implementsMap.entrySet()) { 
      bind(implEntry.getKey()).to(implEntry.getValue()); 
     } 
    } 
} 
+0

+1: И есть родственный вопрос по адресу http://stackoverflow.com/questions/765680/why-theres-no-configuration-file-at-all-for-dependency-injection-with-google-gu –

Смежные вопросы