Доступ к инжектору 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); } } 
  • Регистрация фаз (прототип) во время выполнения весной
  • Как интегрировать поставщика членства IoC с ASP.NET MVC
  • Включение зависимостей Spring в объект EntityListener
  • Вопросы об использовании Ninject
  • Шаблон страtagsи и зависимость от использования с помощью Unity
  • Зависимость впрыска wcf
  • Включение зависимостей со статическим регистратором, статическим вспомогательным classом
  • Инъекционная инъекция с использованием Azure WebJobs SDK?
  • Как я могу вводить в @FacesConverter?
  • Logging, Aspect Oriented Programming и Injection Dependency Injection - Попытка понять все это
  • Как использовать контейнер DI / IoC с привязкой модели в ASP.NET MVC 2+?
  • Interesting Posts

    Значение различных символов в .aspx-странице asp.net

    Как выполнить необработанное обновление sql с динамическим привязкой в ​​рельсах

    Открыть PDF-файл «на лету» из приложения Java

    Получает массив байтов из ByteBuffer в java

    Шифрование полного диска Mac OS X, с Time Machine

    Есть ли смысл в установке антивируса на Ubuntu?

    Почему OS X Lion запрашивает мой пароль всякий раз, когда я удаляю файл в своем домашнем каталоге?

    Угловой UI-маршрутизатор – вложенные состояния с несколькими макетами

    Скрыть учетную запись с экрана входа, но можно использовать в UAC

    Как бы вы сделали строку, разделенную запятыми, из списка строк?

    Как решить уравнения с помощью java?

    Изменение пользовательского агента элемента управления WebBrowser

    Как читать / писать произвольные биты в C / C ++

    Как сделать программу (файл .exe) видимой при поиске из меню «Пуск»

    Инициализация Log4J с помощью Spring?

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