Как получить доступ к инжектору Guice во всем приложении

#java #guice #thrift

#java #guice #бережливость

Вопрос:

Я только начал использовать Guice и, прочитав документы, просмотрев несколько книг и просмотрев доклад Google I / O 2009 года, я пытаюсь преобразовать проект thrift, который опирается на несколько глобальных структур данных. На данный момент они создаются при запуске сервера thrift и передаются обработчику при каждом запросе. Они также используются в каждой части кода! По сути, синглтоны.

Насколько я понимаю, лучше всего создать инжектор в вашем основном методе и загрузить все ваши модули один раз.

Я не уверен, как я должен использовать этот инжектор где-то еще в своем коде. Должен ли я обернуть его в одноэлементный класс и заполнить свой код

 Injector injector = InjectorInstance.get();
ClassA obj = injector.getInstance(ClassA.class);
  

Или есть метод, о котором я не знаю

 ClassA obj = Guice.getLastInjector().getInstance(ClassA.class);
  

Я также нашел рекомендацию обходить поставщиков, но я не уверен, насколько это лучше, чем передавать фактические структуры данных по стеку вызовов.

Если бы кто-нибудь мог объяснить рекомендуемый шаблон или, что еще лучше, направить меня в направлении хорошего проекта с открытым исходным кодом, который использует guice, я был бы благодарен!

Ответ №1:

Для Guice идея заключается в том, что у вас есть целый граф зависимостей, каждая из которых хранит ссылку на то, что ей нужно на протяжении всего срока службы:

 class EntryPoint {
  public static void main(String[] args) {
    YourApp yourApp = Guice.createInjector(yourListOfModules())
        .getInstance(YourApp.class);
    yourApp.run();
  }
}

class YourApp {
  @Inject DependencyA dependencyA;
}

class DependencyA {
  @Inject DependencyB dependencyB;
}

class DependencyB {
  /** This is injected once, so you'll always only get the same instance. */
  @Inject DependencyC dependencyC;
  /** By injecting the provider, you can get multiple instances. */
  @Inject Provider<DependencyD> dependencyD;
}
  

Guice заботится о подключении, поэтому YourApp и DependencyA не нужно беспокоиться о том, нужна ли DependencyB DependencyC или DependencyD. В этом смысле вы никогда не вызываете new : Guice заботится о создании каждой @Inject зависимости ed для вас, а затем предоставляет ее зависимости.

Если вы не подключились к своим зависимостям (т. Е. Вы все еще вызываете new свой код), у вас больше не будет доступа к инжектору из созданного вручную класса. В этом случае вы можете использовать getInstance или getProvider и спрятать его в статическом поле. Guice также поможет вам сделать это с <a rel="noreferrer noopener nofollow" href="https:///google-guice.googlecode.com/git/javadoc/com/google/inject/Binder.html#requestStaticInjection(java.lang.Class…)» rel=»nofollow»>помощью requestStaticInjection, который не подходит для долгосрочного проектирования Guice, но может помочь вам работать с устаревшим кодом или переходить на Guice.

Комментарии:

1. Думаю, теперь я понял, что мне придется попробовать это, спасибо за отличное объяснение!