Вопрос о Guice. Я все еще изучаю его, но могу понять основы.
Этот вопрос уже задавался пару раз в сети, но так и не получил конкретного ответа (ни одного, который я смог найти).
Допустим, у меня ситуация как на картинке (похожий пример был где-то в сети).
public class Dog {}
public class Walk implements Walkable {
private final Dog dog;
private final boolean leash;
@Inject
public Walk(Dog dog, @Assisted boolean leash) {
this.dog = dog;
this.leash = leash;
}
public void go() {
}
}
public interface Walkable {
void go();
}
public interface WalkFactory {
Walk create(boolean leash);
}
public class AssistedMain {
public static void main(String[] args) {
Injector i = Guice.createInjector(new AbstractModule() {
protected void configure() {
install(new FactoryModuleBuilder().
implement(Walkable.class, Walk.class).
build(WalkFactory.class));
}
});
Walk walk = i.getInstance(WalkFactory.class).create(true);
}
}
Это все замечательно. Но вопрос в том, могу ли я каким-то образом переинжектировать этот экземпляр объекта в "контейнер" (инжектор), чтобы использовать его в классах, которые зависят от этой зависимости.
Итак, добавим интерфейс Person
, класс PersonImpl
.
Источником новых классов являются:
public interface Person {
void walkDog();
}
public class PersonImpl implements Person {
private Walkable walkable;
@Inject
public PersonImpl(Walkable walkable) {
this.walkable = walkable;
}
public void setWalkable(Walkable walkable) {
this.walkable = walkable;
}
public void walkDog() {
walkable.go();
}
}
Итак, вопрос в том, смогу ли я каким-то образом внедрить этот конкретный экземпляр в добавленный объект. Это простой пример, но мы можем предположить, что существует 10 уровней классов ниже этого.
Решение, которое я нашел, не очень гибкое. Что-то вроде:
Injector i = Guice.createInjector(new SimpleModule(false, dog));
А затем привязка к конкретному экземпляру. Это не очень динамично. По сути, каждый раз, когда мне нужен другой параметр времени выполнения/динамический параметр, я должен заново создавать инжектор.
Provider
- это хорошо, FactoryModuleBuilder
помогает, но как я могу инжектировать объекты обратно?
Есть ли более динамичные решения этой проблемы?
Спасибо.