2015-07-20 3 views
2

Я новичок в Google Guice и нуждаюсь в небольшой помощи. Я создал модуль вроде этого:Как создать экземпляр реализации в Google Guice

public interface Foo { 
    Bar doSomething(); 
} 

public class MyFoo implements Foo { 
    Bar doSomething() { 
    // create an instance of MyBar 
    } 
} 

public interface Bar { 
    void run(); 
} 

public interface MyBar implements Bar { 
    void run(); 
} 

public class MyModule extends AbstractModule { 

    @Override 
    protected void configure() { 
    bind(Foo.class).to(MyFoo.class); 
    }  
} 

Мой вопрос: Что такое правильный способ создать экземпляр MyBar в классе «MYFOO»? Он чувствует себя не так, чтобы просто сделать это:

public class MyFoo implements Foo { 
    Bar doSomething() { 
    MyBar mybar = new MyBar(); 
    return mybar; 
    } 
} 

Есть ли способ, чтобы придать новый экземпляр MyBar по MyModule, когда мне нужно одно, или я должен вводить завод в конструкторе MyBar для создания MyBar экземпляров ? Если мне нужно использовать фабрику, могу ли я контролировать, какая реализация генерируется через модуль?

ответ

4

Возможно, вы ищете поставщиков услуг? Провайдеры - это более или менее фабрики, которые являются частью API Guice, поэтому вам не нужно их реализовывать.

public class MyFoo implements Foo { 
    @Inject Provider<MyBar> myBarProvider; 

    Bar doSomething() { 
    return myBarProvider.get(); // returns a new instance of MyBar 
    } 
} 

Подробнее см https://github.com/google/guice/wiki/InjectingProviders

+0

Именно то, что я искал. Спасибо – stebeg

+0

Стоит отметить, что это первый шаг к обработке сложного жизненного цикла в виде. Вы могли бы оказаться в будущем, используя больше поставщиков и столкнуться с трудностями (я сделал). Две ключевые вещи, которые разрешили мои проблемы, - это «@ Assisted» (если вам нужно позвонить провайдеру, но вам также необходимо предоставить этому провайдеру какой-то контекст (например, args), чтобы помочь понять проблему зависимости) и явный метод провайдера, (https://github.com/google/guice/wiki/ProvidesMethods), когда вам нужно сделать больше, чем просто вызвать вызов конструктора (запись здесь, похоже, является общей проблемой) – Groostav

1

Вы можете пойти с сеттер или Конструктора Injection, как показано ниже:

public class MyFoo implements Foo { 

    //constructor based injector 
    @Inject 
    public MyFoo(MyBar myBar){ 
     this.myBar=myBar; 
    } 

    //setter method injector 
    @Inject 
    public void setBar(MyBar myBar){ 
     this.myBar=myBar; 
    } 

    Bar doSomething() { 
    // create an instance of MyBar 
    } 
} 

MyBar является Interface в вашем случае which can not be instantiated, вы должны предоставить конкретную реализацию для того же, а затем связать в вашем Module и Вводят его либо через Setter, либо в Constructor Injection, как указано выше.

сеттер инъекций Пример:

MyModule.java

import com.google.inject.AbstractModule; 

public class MyModule extends AbstractModule { 

    @Override 
    protected void configure() { 
     bind(Foo.class).to(MyFoo.class); 
     bind(Bar.class).to(MyBar.class); 
    } 
} 

MyBar.java

public class MyBar implements Bar { 

    public void run() { 
     System.out.println("Hello Bar"); 
    } 
} 

MyFoo.java

import com.google.inject.Inject; 

public class MyFoo implements Foo { 
    private Bar bar; 

    // setter method injector 
    @Inject 
    public void setBar(Bar myBar) { 
     this.bar = myBar; 
    } 

    public Bar doSomething() { 
     return bar; 
    } 
} 
+0

MyBar я ничего не хочу вводить. Метод doSomething() должен создать экземпляр MyBar и вернуть его. – stebeg

+0

Обновленный ответ! – Arpit

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