Pregunta

¿Cómo puedo usar JSR-299 CDI para inyectar frijoles (no anotados) de bibliotecas externas?

Ejemplos:

La interfaz X y sus implementaciones provienen de un tercero lib. ¿Cómo puedo decidir qué implementación usar?

class A {

    @Inject 
    private X x;

}

¿Qué pasaría si tuviera varias clases usando la interfaz X pero implementaciones diferentes?

class A {

    @Inject 
    private X x; // should be XDefaultImpl

}

class B {

    @Inject 
    private X x; // should be XSpecialImpl

}
¿Fue útil?

Solución

Use productores:

public class ClassInABeanArchive {
    @Produces @SpecialX public X createSpecialX() {
        return new XSpecialImpl();
    }

    @Produces @DefaultX public X createDefaultX() {
        return new XDefaultImpl();
    }
}

Tendrás que definir el @SpecialX y @DefaultX calificadores. y úsalos junto con @Inject:

@Qualifier
@Retention(..)
@Target(..)
public @interface SpecialX {}

Si no necesita diferenciar dos implementaciones, omita la parte de calificadores.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top