web-dev-qa-db-fra.com

Comment injecter par programme un bean géré Java CDI dans une variable locale d'une méthode statique

Comment puis-je injecter par programme un bean géré Java CDI 1.1+ dans une variable locale d'une méthode statique?

28
XDR

Pour injecter une instance de classe C:

javax.enterprise.inject.spi.CDI.current().select(C.class).get()

Ceci est disponible dans CDI 1.1+

41
XDR

Utilisez par exemple cet utilitaire class . En gros, vous devez obtenir une instance de BeanManager et vous en extraire le haricot souhaité (imaginez quelque chose comme une recherche JNDI).

Mettre à jour

Vous pouvez également utiliser CDI l'utilitaire proposé dans CDI 1.1.

SomeBean bean = CDI.current().select(SomeBean.class).get();
13
Petr Mensik

@BRS

import javax.enterprise.inject.spi.CDI;

...

IObject iObject = CDI.current().select(IObject.class, new NamedAnnotation("iObject")).get();

Avec:

import javax.enterprise.util.AnnotationLiteral;

public class NamedAnnotation extends AnnotationLiteral<Named> implements Named {

     private final String value;

     public NamedAnnotation(final String value) {
         this.value = value;
     }

     public String value() {
        return value;
    }
}
7
XDR

Le lien proposé par @Petr Mensik est très utile. J'utilise le même code dans mon exemple.

Voici un moyen d'obtenir une instance de la classe dans méthodes d'instance/méthodes statiques. Il est toujours préférable de coder pour les interfaces plutôt que d'utiliser le nom de classe codé en dur dans les méthodes.

@Named(value = "iObject ")
@RequestScoped
class IObjectImpl  implements IObject  {.....}

//And in your method

IObject iObject = (IObject) ProgrammaticBeanLookup.lookup("iObject");
.........
//Invoke methods defined in the interface

Cette recherche programmatique de beans peut être très utile lorsque vous avez un objet d'application couvert avec une méthode qui nécessite une instance d'une classe qui peut changer avec le temps. Il est donc toujours préférable d’extraire l’interface et d’utiliser une recherche programmée de haricots dans l’intérêt d’un couplage lâche.

2
phoenix

Vous devez inclure des qualificatifs:

List<Annotation> qualifierList = new ArrayList();
 for (Annotation annotation: C.class.getAnnotations()) {
   if (annotation.annotationType().isAnnotationPresent(Qualifier.class)) {
     qualifierList.add(annotation);
   }
 }
javax.enterprise.inject.spi.CDI.current()
   .select(C.class, qualifierList.toArray(new Annotation[qualifierList.size()])
   .get()
1
  • Vous pouvez définir un paramètre avec le type de l'interface de bean dans Votre méthode statique et passer une référence d'implémentation appropriée . Cela le rendrait plus convivial pour les tests unitaires.
  • Si vous utilisez Apache Deltaspike , vous pouvez utiliser BeanProvider # getContextualReference . C'est plus facile que d'obtenir un javax.enterprise.inject.Instance, mais méfiez-vous des beans dépendants (voir javadoc)!
0
jpangamarca