Доступ к инжектору Guice в его модуле?

Я расширяю AbstractModule Guice и внутри расширяющегося classа, мне нужен доступ к инжектору Гиса. Это возможно, если да, то как?

Это необычный запрос. Модули больше похожи на файлы конфигурации, чем на логические файлы. Модуль читается для создания Инжектора, а затем, как только инжектор создается, модуль выполнил свою работу. Для простого модуля инжектор буквально не существует, пока модуль не будет готов к отбрасыванию.

В любом случае, вместо того, чтобы запрашивать инжектор для получения classа X, вы обычно должны запрашивать Provider . Guice будет вводить X или Provider для любой привязки X , Provider или @Provides X , поэтому вы можете почти всегда делать это вместо этого. Тем не менее, инъекция инжектора позволит вам получить экземпляр рефлексивно или проверить привязки Инъектора (и т. Д.).

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

В методе @Provides :

Модули могут содержать мини-провайдеров в методах, аннотированных с помощью @Provides . Помните, что Injector инъектируется : если вам нужен инжектор в одном из этих методов, вы можете просто принять его как параметр:

 public class OneModule extends AbstractModule { @Override public void configure() { /* ... */ } @Provides YourDependency getYourDependency(Injector injector) { return injector.getInstance(Class.forName(yourDependencyName)); } @Provides Something getSomething(SomethingImpl something) { return initialize(something); // preferred: only ask for what you need } @Provides SomethingElse getSomethingElse(Provider thingProvider) { return new SomethingElse(thingProvider); // asking for a provider works too } } 

Чтобы получить Провайдера в вашем configure ():

AbstractModules раскрывают getProvider() именно по этой причине, хотя вы получите сообщение об ошибке, если вы вызываете get() в этом Провайдере, прежде чем инжектор будет готов его предоставить (например, во время настройки):

 public class TwoModule extends AbstractModule { @Override public void configure() { bind(Thingy.class).toInstance( new MyThingy(8675309, getProvider(Another.class))); } } 

Вероятно, вы можете вызвать getProvider(Injector.class) но я не знаю, работает ли это, и я не знаю, зачем вам это нужно.

Чтобы получить экземпляр в configure ():

Это плохая идея; Guice не готов предоставлять экземпляры до тех пор, пока не будут запущены все методы настройки. Самое близкое, что вы можете получить, это создать дочерний инжектор, используя другие модули, и передать его в этот модуль, но даже это редко необходимо.

 public class MainClass { public static void main(String[] args) { Injector firstStage = Guice.createInjector(new OtherModule1(), new OtherModule2()); // An alternative design would @Inject-annotate fields in ThreeModule // and get it from firstStage, but that's nonstandard and may be confusing. Injector secondStage = firstStage.createChildInjector(new ThreeModule(firstStage)); } } public class ThreeModule extends AbstractModule { private final Injector otherInjector; public ThreeModule(Injector otherInjector) { this.otherInjector = otherInjector; } @Override public void configure() { bindStuffBasedOn(otherInjector); } } 
  • Вопросы об использовании Ninject
  • Инъекционная инъекция с использованием Azure WebJobs SDK?
  • Logging, Aspect Oriented Programming и Injection Dependency Injection - Попытка понять все это
  • Инъекция зависимостей - требуется новый экземпляр для нескольких методов classов
  • Как интегрировать поставщика членства IoC с ASP.NET MVC
  • Использование инъекции зависимостей без какой-либо библиотеки DI
  • Инъекция зависимости: Черепахи полностью вниз?
  • Как использовать контейнер DI / IoC с привязкой модели в ASP.NET MVC 2+?
  • Фабричный метод с DI и IoC
  • Spring: namespace vs contextConfigИнтересные параметры размещения в web.xml
  • Регистрация фаз (прототип) во время выполнения весной
  • Interesting Posts

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

    Outlook 2013 с GMail Over IMAP не хватает всей почтовой папки

    Почему скорость передачи данных по Fast Ethernet (по 100 Мбит / с, по моему мнению) составляет всего ~ 1,5 Мбайт / с

    Как обрабатывать изменение ориентации экрана, когда диалог выполнения и фоновый stream активны?

    Как ssh к недоступной удаленной машине путем туннелирования через сервер, к которому все могут добраться?

    Как использовать защиту ATA на жестком диске на практике?

    Как обмануть Windows 10, чтобы подумать, что у нее больше RAM, а потом?

    добавить ссылку на фасоль в кварцевую работу весной?

    Как избежать нескольких экземпляров формы Windows в c #

    Android YouTubePlayer с несанкционированным наложением поверх проигрывателя

    Создание удлинительных кабелей USB с использованием кабеля UTP

    Как проверить пропускную способность между 2 сетевыми адаптерами на одном ПК?

    Windows на гибридном MBR / GPT

    Вектор выходит за пределы без ошибок

    Создание объекта: с или без `new`

    Давайте будем гением компьютера.