Когда следует использовать экземпляр и провайдер для ввода beans?

Я читал документацию API Instance и Provider, но не совсем понятно, когда они должны использоваться.

Какая разница между следующими подходами?

@Inject
MyBean bean;
@Inject
Instance<MyBean> bean;
@Inject
Provider<MyBean> bean;

Ответ 1

Provider<T> - это интерфейс JSR-330, который расширяется интерфейсом CDI Instance<T>.

Инъекция MyBean, ваше приложение будет генерировать исключение во время запуска, если нет соответствующего bean или более одного соответствия bean.

В приложение Instance<MyBean>, bean разрешено делегировать приложение: вы можете перебирать всех кандидатов beans и select() тот, который вы хотите, или вызывать isUnsatisfied(), и решить, что делать, когда нет соответствующего bean.

Для beans с областью @Dependent вызов Instance.get() создаст новый экземпляр для каждого вызова, и вы должны вызывать Instance.destroy(t) для каждого такого экземпляра, когда он вам больше не нужен.

Provider имеет только метод get(), но не destroy() или select() и не поддерживает итерацию. В среде CDI для любого варианта использования, адресованного Provider<T>, вам лучше использовать Instance<T>.