2016-05-17 4 views
0

Извините, что задал немой вопрос, но я совершенно новый для Java и Guice framework. Я не понимаю использование класса Guice Provider, который предоставляет экземпляр любого класса в сжатии для обычного инъецированного экземпляра. Насколько я понимаю, он позволяет создавать несколько экземпляров класса, где экземпляр Injected всегда является Singleton. Разве это единственное различие или есть что-то большее?Зачем использовать Guice Provider вместо обычной инъекции

т.е. разница между:

@Inject SomeClass someObjcet;

VS

@Inject Provider<SomeClass> provider; provider.get();

+1

Guice вводит экземпляр для вас. –

+0

И provider.get() также дает вам экземпляр. Так это всего лишь два разных способа создания объекта? –

+0

Вы имеете в виду ['@ Provides' methods] (https://github.com/google/guice/wiki/ProvidesMethods) vs [внедрение« Поставщик '] (https://github.com/google/guice/wiki/ProviderBindings)? – zapl

ответ

5

Есть три различных причин, вы можете придать Provider<T> вместо того, чтобы просто инъекционного T (см Guice's documentation):

  1. Каждый вызов метода get() в реализации Provider будет (обычно) возвращать новый экземпляр зависимости. Это было бы полезно, если у упомянутых экземпляров есть изменяемое состояние (в противном случае зависимый класс при доступе от нескольких потоков может столкнуться с проблемами параллелизма).
  2. Поставщик разрешает ленивый loading Зависимость, которая является дорогостоящей для создания экземпляра. С провайдером объект будет только будет создан, если и когда вызывается метод get(), который определяется вашим кодом.
  3. Зависимый объект из «более широкой» области (часто глобальный синглтон) может с помощью провайдера получать экземпляры объектов с более узкой областью. Например, он может получить объект User с областью действия запроса (или с областью действия сеанса).
+3

я могу думать о более один: 4) в случае круговых зависимостей (A получает B впрыскивается, B получает впрыскивается) uing провайдеры могут решить проблему параллельного создания. –

+0

Возможно, это не так важно, как уже упомянутые 4 причины, но если вам действительно нужно вставить сам инжектор в компонент (например, вы создаете какую-то фреймворк), чем вводить «Provider », путь быстрее, чем инъекция «Инжектор» напрямую. – electrotype

Смежные вопросы