Когда следует использовать экземпляр и провайдер для ввода 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>.