Comment puis-je injecter par programme un bean géré Java CDI 1.1+ dans une variable locale d'une méthode statique?
Pour injecter une instance de classe C
:
javax.enterprise.inject.spi.CDI.current().select(C.class).get()
Ceci est disponible dans CDI 1.1+
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();
@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;
}
}
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.
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()