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

1

У меня есть объект A, который выполняет некоторую важную загрузку. Я использую для этого поставщика. У меня есть объект B, для которого требуется инициализация A. Однако в объекте CI нужно правильно передать A и B.

Можно ли заставить провайдера возвращать один и тот же экземпляр все время или модуль guice, чтобы этот экземпляр предоставлялся и останавливался прямо там?

Отредактировано:

На веб-сайте guice у меня есть несколько пояснений:

@Provides @Singleton
TransactionLog provideTransactionLog() {
  ...
}

Это решение. Одиночный ордер применяется к провайдеру или предоставленному. Если это применимо к провайдеру, то решение будет состоять в том, чтобы сохранить один экземпляр и возвращать его каждый раз. Но это не будет работать с методом предоставления. Любая помощь?

Теги:
guice

1 ответ

5

Guice очень однородный по своей сути. Внутренне он полностью основан на провайдерах. Связанные привязки, привязки к экземплярам, привязки к поставщикам, привязки "точно в момент времени", @Provides -bindings - все виды привязки, по сути, всегда будут генерировать провайдера под капотом. Следовательно, аннотации области не могут применяться к провайдерам, это просто не имеет смысла. Области всегда назначаются фактическим инъецированным объектам, поэтому вы можете быть уверены, что если вы поместите какое-то привязку в область @Singleton, фактический инжектируемый объект всегда будет тем же самым, независимо от вида этой привязки.

Таким образом, каждое из этих привязок всегда будет вам точно таким же уникальным объектом (конечно, вы не можете поместить все эти привязки в свой модуль, выберите тот, который вам больше нравится):

bind(SomeDependency.class).to(SomeDependencyImpl.class).in(Singleton.class);

bind(SomeDependency.class).toInstance(new SomeDependencyImpl());

bind(SomeDependency.class).toProvider(() -> new SomeDependencyImpl()).in(Singleton.class);

public class SomeModule extends AbstractModule {
    @Provides @Singleton
    SomeDependency someDependencyImpl() {
        return new SomeDependencyImpl();
    }
}
  • 0
    Большое спасибо за ваше проницательное объяснение !!! Очень ясно. Хотя есть только один момент, которому я не уверен следовать. Последний пример. Соответствует ли это случаю реализации вашего собственного класса провайдера?
  • 0
    @ MaatDeamon, ты имеешь в @Provides метод @Provides ? Нет, эти методы определены в модулях. Поставщики возвращают новые объекты только через методы get() . Случай с нестандартным провайдером является вторым по продолжительности, он использует лямбда-синтаксис Java 8.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню