何时应该使用Instance 和Provider 在CDI中注入bean?

我一直在阅读InstanceProvider的API文档,但是它们何时应该被使用还不是很清楚。

以下方法有什么区别?

 @Inject MyBean bean; 
 @Inject Instance bean; 
 @Inject Provider bean; 

Provider是一个JSR-330接口,由CDI接口Instance扩展。

注入MyBean ,如果没有匹配的bean或多个匹配的bean,应用程序将在启动期间抛出exception。

注入Instance ,将bean解析委托给应用程序:您可以迭代所有候选bean并select()您想要的isUnsatisfied()或调用isUnsatisfied()并决定在没有匹配的bean时要做什么。

对于具有@Dependent范围的bean,调用Instance.get()将为每个调用创建一个新实例,并且当您不再需要它时,应该为每个此类实例调用Instance.destroy(t)

Provider只有get()方法,但没有destroy()select() ,也不支持迭代。 在CDI环境中,对于Provider解决的任何用例,最好使用Instance