Guice: как вы настраиваете @Provides и @Singleton в модуле в этом случае?
У меня есть метод провайдера в модуле, аннотированный с помощью @Provides:
@Provides
public ChatServicePerformanceMonitor getChatServicePerfMon() {
...
}
и я аннотировал мой ChatServicePerformanceMonitor с @Singleton. В моем коде, где я использую этот экземпляр, я не могу заставить его "пассивно" вводить его из-за рамки, которую я использую для построения охватывающего класса (он не использует Guice, так что это единственный способ, которым я знаю для получения справки):
chatServicePerfMon = injector.getInstance(ChatServicePerformanceMonitor.class);
Кажется, что Guice не уважает аннотацию @Singleton в моем классе ChatServicePerformanceMonitor. Я получаю экземпляр для каждого вызова инжектора .getInstance(ChatServicePerformanceMonitor.class).
Добавление метода @Singleton к методу провайдера, похоже, исправляет это:
@Provides @Singleton
public ChatServicePerformanceMonitor getChatServicePerfMon() {
...
}
Это ожидаемое поведение? Кажется, @Singleton на экземпляре должен быть всем, что мне нужно.
Ответы
Ответ 1
Если вы создаете ChatServicePerformanceMonitor
следующим образом:
@Provides
public ChatServicePerformanceMonitor getChatServicePerfMon() {
return new ChatServicePerformanceMonitor();
}
то аннотация вашего уровня уровня @Singleton
не будет иметь никакого эффекта, потому что Guice не создает объект. Guice может только применять область действия к объектам, которые она создает. Нет ничего плохого в добавлении @Singleton
к вашему методу getChatServicePerfMon()
.
Если у вас есть конструктор без аргументов (или конструктор @Inject
) в классе ChatServicePerformanceMonitor
, и вы удалите свой метод @Provides
, то непрерывные вызовы инжектора вернут тот же синглтон.
Ответ 2
Тем временем эта функция доступна (проверена с помощью Guice 4.0).
Теперь методы @Provides
также могут быть аннотированы с помощью @Singleton
для применения области. См. https://github.com/google/guice/wiki/Scopes