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