简体   繁体   中英

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

I've been reading the API documentation of Instance<T> and Provider<T> , but it isn't completely clear when they should be used.

What's the difference between the following approaches?

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

Provider<T> is a JSR-330 interface which is extended by the CDI interface Instance<T> .

Injecting MyBean , your application will throw an exception during startup when there is no matching bean or more than one matching bean.

Injecting Instance<MyBean> , bean resolution is delegated to the application: you can iterate over all candidate beans and select() the one you want or call isUnsatisfied() and decide what to do when there is no matching bean.

For beans with @Dependent scope, calling Instance.get() will create a new instance for each invocation, and you should invoke Instance.destroy(t) for each such instance when you no longer need it.

Provider just has the get() method, but no destroy() or select() and does not support iteration. In a CDI environment, for any use case addressed by Provider<T> , you had better use Instance<T> instead.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM