У меня есть объект A, который выполняет некоторую важную загрузку. Я использую для этого поставщика. У меня есть объект B, для которого требуется инициализация A. Однако в объекте CI нужно правильно передать A и B.
Можно ли заставить провайдера возвращать один и тот же экземпляр все время или модуль guice, чтобы этот экземпляр предоставлялся и останавливался прямо там?
Отредактировано:
На веб-сайте guice у меня есть несколько пояснений:
@Provides @Singleton
TransactionLog provideTransactionLog() {
...
}
Это решение. Одиночный ордер применяется к провайдеру или предоставленному. Если это применимо к провайдеру, то решение будет состоять в том, чтобы сохранить один экземпляр и возвращать его каждый раз. Но это не будет работать с методом предоставления. Любая помощь?
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();
}
}
@Provides
метод@Provides
? Нет, эти методы определены в модулях. Поставщики возвращают новые объекты только через методыget()
. Случай с нестандартным провайдером является вторым по продолжительности, он использует лямбда-синтаксис Java 8.