何时应使用实例<T>和提供者<T>在 CDI 中注入豆类?

2022-09-04 21:37:31

我一直在阅读实例<T>提供者<T>的API文档,但目前还不完全清楚何时应该使用它们。

以下方法之间有什么区别?

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

答案 1

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

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

注入 ,将 bean 解析委托给应用程序:您可以迭代所有候选 Bean 以及您想要或调用的 bean,并决定在没有匹配的 Bean 时要执行的操作。Instance<MyBean>select()isUnsatisfied()

对于具有作用域的 Bean,调用将为每个调用创建一个新实例,并且当您不再需要它时,应为每个此类实例调用。@DependentInstance.get()Instance.destroy(t)

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


答案 2

推荐