Quand utiliser javax.inject.Provider au spring?

Ce qui est fait est assez simple:

@Inject private Provider productService; 

Le service Product est disponible via productService.get() et .get() résoudra l’instance à partir du contexte Spring à chaque appel.

Mais quand devrais-je l’utiliser? Et où?

Mon cas d’utilisation principal est assez simple: quand j’obtiens des dépendances circulaires, le fournisseur aide à résoudre la dépendance au moment de l’exécution. Mais cela semble un peu aléatoire si vous le lancez juste quand vous ne pouvez pas créer votre contexte causé par une dépendance circulaire.

Existe-t-il des modèles connus concernant l’utilisation des fournisseurs?

Cette interface est équivalente à org.springframework.beans.factory.ObjectFactory généralement utilisée pour éviter les BeanFactory.getBean() dans le code client lors de la recherche d’instances prototypes. Souvent utilisé avec ObjectFactoryCreatingFactoryBean pour obtenir des haricots de prototypes BeanFactory par BeanFactory .

exemple extrait de ObjectFactoryCreatingFactoryBean ObjectFactoryCreatingFactoryBean:

           

Avec les Providers , vous pouvez utiliser à la place le ProviderCreatingFactoryBean .

Une autre option pour résoudre le même problème (utiliser l’inheritance au lieu de la composition) est l’ injection de méthode de recherche.

Dans cdi, les fournisseurs sont habitués à injecter des objects de moindre envergure dans un grain de taille supérieure, par exemple. si un bean de session a besoin d’accéder à un object de requête, il injecte un fournisseur puis une méthode qui s’exécute dans une requête, appelle provider.get() pour obtenir une référence de variable locale à l’object de requête approprié.

Compte tenu de ce qui suit:

 @RequestScoped public class Bean1 { void doSomething(); } 

Ce qui suit utilisera l’instance Bean1 associée à la première demande de la session pour utiliser Bean2, quelle que soit la requête qui appelle Bean2.doSomething ():

 @SessionScoped public class Bean2 { @Inject Bean1 bean; public void doSomething() { bean.doSomething(); } } 

Ce qui suit utilisera l’instance de Bean associée à la demande particulière qui appelle actuellement Bean3.doSomething (), c’est-à-dire un bean différent pour chaque demande:

 @SessionScoped public class Bean3 { @Inject Provider bean; public void doSomething() { bean.get().doSomething(); } }