Частный родительский модуль Guice предоставляет привязку к дочерним модулям

#guice

#guice

Вопрос:

У меня есть следующее дерево зависимостей частного модуля Guice:

 public class FooModule extends PrivateModule {
    @Override
    protected void configure() {
      install(new BarModule());
      bind(Person.class);
      expose(Person.class);
    }
}

public class BarModule extends PrivateModule {
    @Override
    protected void configure() {
      install(new LifeImplModule());
      bind(Animal.class);
      expose(Animal.class);
    }
}

public class LifeImplModule extends PrivateModule {
    @Override
    protected void configure() {
      bind(Life.class).toInstance(new LifeImpl());
      expose(Life.class);
    }
}

public class Animal {
    @Inject
    public Animal(Life life) {
      //
    }
}

public class Person {
    @Inject
    public Person(Life life) {
       //
    }
}
 

Теперь, когда я Guice.createInjector(new FooModule()).getInstance(Person.class) это делаю, происходит сбой, поскольку он не распознает привязку, в Life.class то Guice.createInjector(new FooModule()).getInstance(Animal.class) время как работает, поскольку у него есть привязка к Life via BarModule .

Как мне решить эту проблему? Я попытался переместить
install(new LifeImplModule()); to FooModule() но тогда Animal.class не работает, пока Person.class работает.

Кто-нибудь может объяснить, как работает частный модуль Guice с точки зрения наследования привязок? install(LifeImplModule()) Не FooModule работает для обоих Person.class и дочернего модуля BarModule() ?

Ответ №1:

Поскольку BarModule это частный модуль, любые модули, установленные внутри него, не будут доступны извне.
Вот почему

 install(new LifeImplModule());
 

не предоставляет доступ к Life привязке для FooModule .
Вы можете решить эту проблему, явно предоставив Life из BarModule

 install(new LifeImplModule());
expose(Life.class);