views:

44

answers:

1

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

}
+1  A: 

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.

Bozho
+1 How went your partial implementation of JSR-299 BTW?
Pascal Thivent
I submitted it. It wasn't of quite a good quality, but the major features worked fine :) I made a sample jsf2 app to demonstrate some of the features. All others were unit-tested. Now I plan to make a presentation on CDI in front of BG JUG. We'll see :)
Bozho
(http://code.google.com/p/blinkframework/ it's here, but it isn't of "production interest" :) )
Bozho