Question

How can I use JSR-299 CDI to inject (not annotated) beans from external libraries?

Examples:

Interface X and its implementations come from a third party lib. How can I decide which implementation to use?

class A {

    @Inject 
    private X x;

}

What if I had several classes using the X interface but different implementations?

class A {

    @Inject 
    private X x; // should be XDefaultImpl

}

class B {

    @Inject 
    private X x; // should be XSpecialImpl

}
Was it helpful?

Solution

Use producers:

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

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

You will have to define the @SpecialX and @DefaultX qualifiers. and use them together with @Inject:

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

If you don't need to differentiate two implementations, skip the qualifiers part.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top