Самозагрузочный инжектор Guice

У меня есть сценарий, в котором мне понадобятся некоторые объекты, вводимые с самого начала, такие как регистрация, но затем другие объекты вводятся по требованию. Что я не знаю, если в моем консольном приложении, я просто позвоню

Guice.createInjector(....)

в моей функции Main, а затем, когда мне нужен другой объект, тип, который мне нужен по требованию, я использую провайдер для инъекции этого же объекта снова? Мне трудно понять, как лучше всего использовать инжектор Guice для этого сценария. Заранее спасибо.

1 ответ

Решение

В общем, да: залить Provider чтобы получить ваши объекты позже, и не держите ваш инжектор напрямую дольше, чем это необходимо.

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

public class YourApplication {

  public static void main(String[] args) {
    // Only three lines exist outside the object graph.
    Injector injector = Guice.createInjector(new YourModule1(), new YourModule2());
    YourApplication app = injector.getInstance(YourApplication.class);
    app.run();
  }

  @Inject Provider<YourDep1> depProvider1;
  @Inject YourDep2 dep2;

  public void run() {
    // Here you have access to every @Inject field.
  }
}

Здесь имейте в виду, что созданный вами инжектор хранится только в стеке. Это потому, что вы получаете все, что вам нужно от @Injectполя, методы и конструкторы, включая сам Инжектор. Как вы предложили, вы можете использовать Provider чтобы получить столько экземпляров, сколько вам нужно, включая ноль экземпляров, если объект не нужен в этом пути кода.

Другие вопросы по тегам