Доступ к инжектору 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); } } 
  • Вставить услугу в Action Filter
  • Инъекция зависимостей и JavaFX
  • Как передать значения конструктору в моей службе wcf?
  • Циркулярная зависимость впрыска угловая 2
  • Модульный ввод / вывод файлов
  • Каковы преимущества контейнеров для инъекций зависимостей?
  • Как использовать контейнер DI / IoC с привязкой модели в ASP.NET MVC 2+?
  • Как интегрировать поставщика членства IoC с ASP.NET MVC
  • Инъекция зависимостей в Struts2 Доступ к фазам с включенным сеансом
  • Logging, Aspect Oriented Programming и Injection Dependency Injection - Попытка понять все это
  • Шаблон страtagsи и зависимость от использования с помощью Unity
  • Interesting Posts

    Ошибка: не удается получить доступ к файловому ящику / Debug / …, потому что он используется другим процессом

    Почему этот расчет с плавающей запятой дает разные результаты на разных машинах?

    Обещание против наблюдаемого

    Как объяснить обратные вызовы на простом английском языке? Как они отличаются от вызова одной функции от другой функции?

    Можно ли перечислить имена файлов (или их родительские каталоги), которые были недавно удалены с помощью rm в OS X?

    Файлы cookie ASP.NET_SessionId + OWIN не отправляются в браузер

    Замена текста H1 на изображение логотипа: лучший способ для SEO и доступности?

    Почему мы должны указывать FromBody и FromUri?

    Как работает Copy-local? log4net.dll не копируется в каталог вывода MyProject

    AngularJS. Преобразование значения тега (время Unix для чтения человеком)

    Являются ли члены структуры C ++ инициализированы по умолчанию 0?

    Как редактировать пользовательские интерфейсы программ Mac OS X?

    Разница между двумя датами в SQLite

    GetProperties () возвращает все свойства иерархии наследования интерфейса

    Есть ли способ создать пользовательскую горячую клавишу в Windows, которая закроет текущее окно или под-окно?

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