javadependency-injectionjakarta-eecdijsr299

How to inject beans from external libs with CDI?


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

}

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.