什么时候应该使用 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>
。
我一直在阅读 Instance<T>
and Provider<T>
的 API 文档,但尚不完全清楚何时应该使用它们。
以下方法有什么区别?
@Inject
MyBean bean;
@Inject
Instance<MyBean> bean;
@Inject
Provider<MyBean> bean;
Provider<T>
是一个由 CDI 接口 Instance<T>
.
注入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>
。