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