sirve que qualifier para inyeccion ejemplo dependencias bean java dependency-injection cdi jboss-weld weld

que - Cómo inyectar un bean administrado CDI de Java en una variable local mediante un método estático mediante programación.



inyeccion de dependencias spring autowired (6)

@BRS

import javax.enterprise.inject.spi.CDI; ... IObject iObject = CDI.current().select(IObject.class, new NamedAnnotation("iObject")).get();

Con:

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; } }

¿Cómo puedo inyectar mediante programación un bean administrado Java CDI 1.1+ en una variable local en un método estático?


Debe incluir calificadores:

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()


El enlace sugerido por @Petr Mensik es muy útil. Estoy usando el mismo código en mi ejemplo.

Aquí hay una forma de obtener una instancia de la clase en métodos de instancia / métodos estáticos. Siempre es mejor codificar para interfaces en lugar de usar el nombre de clase codificado en los métodos.

@Named(value = "iObject ") @RequestScoped class IObjectImpl implements IObject {.....} //And in your method IObject iObject = (IObject) ProgrammaticBeanLookup.lookup("iObject"); ......... //Invoke methods defined in the interface

Esta búsqueda programática de beans puede ser bastante útil cuando tiene un objeto de ámbito de aplicación con un método que requiere una instancia de una clase que puede cambiar con el tiempo. Por lo tanto, siempre es mejor extraer la interfaz y usar la búsqueda programática de beans por el bien del acoplamiento suelto.


Utilice por ejemplo esta class utilidad. Básicamente, tienes que obtener una instancia de BeanManager y luego tomar el bean que quieres de él (imagina algo como la búsqueda JNDI).

Actualizar

También puede usar la clase de utilidad CDI ofrecida en CDI 1.1

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


Para inyectar una instancia de clase C :

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

Esto está disponible en CDI 1.1+


  • Podría definir un parámetro con el tipo de interfaz de bean en su método estático y pasar una referencia de implementación apropiada. Eso lo haría más amigable con las pruebas unitarias.
  • Si está utilizando Apache Deltaspike , puede usar BeanProvider#getContextualReference . Es más fácil que obtener un javax.enterprise.inject.Instance, pero, ¡cuidado con los beans dependientes (ver javadoc)!