Comment utiliser CDI pour l'injection de paramètres de méthode?
Est-il possible d'utiliser le CDI à injecter des paramètres dans les appels de méthode? Les comportements qui sont attendus seraient similaires à domaine de l'injection. Le fabricant préférentiel est regardé et le produit est utilisé.
Ce que j'aimerais faire, c'est ceci:
public void foo(@Inject Bar bar){
//do stuff
}
ou ce (ou avec moins de confusion sytax):
public void foo(){
@Inject
Bar bar;
//do stuff
}
Cette syntaxe est illégal dans les deux cas. Est-il une alternative? Si ne - serait-ce une mauvaise idée pour une raison quelconque, si c'était possible?
Merci
MODIFIER - j'ai peut être fait à mes attentes pas assez clair - je voudrais pouvoir appeler la méthode directement, laissant l'initialisation de la bar
variable pour le conteneur. Jörn Horstmann et la Perception de la réponse suggèrent qu'il n'est pas possible.
source d'informationauteur kostja
Vous devez vous connecter pour publier un commentaire.
Les points d'Injection sont traitées pour un haricot lorsqu'il est instancié par le conteneur, ce qui ne limite pas le nombre de cas d'utilisation pour la méthode de niveau d'injection. La version actuelle de la norme reconnaît les types suivants de la méthode d'injection:
Initialiseur de la méthode d'injection
Lorsqu'une instance de
MyBean
est injecté, le processeur instance sera également injecté, via la définition de la méthode.Événement Observateur Méthodes
L'instance d'événement est injecté dans le cas de la méthode de gestion directement (mais, pas avec l'annotation @Inject)
Producteur Méthodes
Paramètres de producteur méthodes d'obtenir automatiquement injecté.
Si ce que vous voulez VRAIMENT n'est pas quelque chose que le paramètre de la méthode (qui doit être fournie par l'appelant), mais un initialisé correctement instance d'un bean CDI à chaque fois lorsque la méthode est appelée, et entièrement construit et injecté, puis vérifier
javax.inject.Provider<T>
Fondamentalement, d'abord injecter un prestataire de services de la classe
ensuite, dans la méthode, d'obtenir une nouvelle instance
Espère que cela aide 🙂
De la fonctionnalité de CDI est appelé "initialisation de la méthode". La syntaxe diffère de votre code dans l'ensemble de la méthode est annoté avec
@Inject
les paramètres de la méthode peuvent être annotés par des qualificatifs pour sélectionner un haricot. L'article 3.9 du JSR 299 montre l'exemple suivant, avec@Selected
être un qualificatif qui peut être omis s'il n'existe qu'un seul haricot mise en œuvre.Veuillez noter que
Cette question s'est posée lorsque j'ai d'abord fait une recherche sur ce sujet, et depuis, j'ai appris qu'avec la sortie de CDI 1.1 (inclus dans le JavaEE 7 spec), il existe désormais un moyen de le faire réellement ce que l'OP a voulu, en partie. Vous ne pouvez pas toujours faire
mais vous pouvez les "injecter" une variable locale, même si vous n'utilisez pas
@Inject
mais plutôt par programmation chercher le injecté exemple comme ceci:Noter que le
select()
méthode peut éventuellement prendre toute qualifier les annotations que vous pourriez avoir besoin de fournir. Bonne chance pour l'obtention des instances dejava.lang.annotation.Annotation
. Il peut être plus facile à parcourir votreInstance<Bar>
pour trouver celui que vous voulez.J'ai dit que vous devez détruire la
Instance<Bar>
comme je l'ai fait ci-dessus, et qui peut vérifier à partir de l'expérience que le code ci-dessus fonctionne; cependant, je ne jure que vous besoin pour la détruire.Vous pouvez utiliser le BeanManager API dans votre méthode pour obtenir des références contextuelles, ou en fonction de votre but ultime vous pourrait injecter un
en dehors de la méthode et de l'utiliser dans la méthode.