什么时候应该使用 Instance<T> 和 Provider<T> 在 CDI 中注入 bean?

When should Instance<T> and Provider<T> be used to inject beans in CDI?

我一直在阅读 Instance<T> and Provider<T> 的 API 文档,但尚不完全清楚何时应该使用它们。

以下方法有什么区别?

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

Provider<T> 是一个由 CDI 接口 Instance<T>.

扩展的 JSR-330 接口

注入MyBean,当没有匹配的bean或多个匹配的bean时,您的应用程序将在启动期间抛出异常。

注入 Instance<MyBean>,bean 解析被委托给应用程序:您可以遍历所有候选 bean 和 select() 您想要的或调用 isUnsatisfied() 并决定何时做什么没有匹配的bean。

对于具有 @Dependent 作用域的 bean,调用 Instance.get() 将为每次调用创建一个新实例,您应该在不再需要时为每个此类实例调用 Instance.destroy(t)

Provider 只有 get() 方法,没有 destroy()select() 并且不支持迭代。在 CDI 环境中,对于 Provider<T> 解决的任何用例,您最好改用 Instance<T>