何时应使用Instance <T>和Provider <T>在CDI中注入bean?

cas*_*lin 8 java dependency-injection java-ee cdi

我一直在阅读的API文档Instance<T>Provider<T>, but it isn't completely clear when they should be used.

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

@Inject
MyBean bean;
Run Code Online (Sandbox Code Playgroud)
@Inject
Instance<MyBean> bean;
Run Code Online (Sandbox Code Playgroud)
@Inject
Provider<MyBean> bean;
Run Code Online (Sandbox Code Playgroud)

Har*_*ann 5

Provider<T>是由CDI接口扩展的JSR-330接口Instance<T>

注入时MyBean,如果没有匹配的Bean或一个以上的匹配Bean,则应用程序将在启动期间引发异常。

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

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

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