如何使用CDI从外部库中注入bean?

dea*_*mon 7 java dependency-injection jsr299 java-ee cdi

如何使用JSR-299 CDI从外部库中注入(未注释)bean?

例子:

接口X及其实现来自第三方lib.我如何决定使用哪种实现?

class A {

    @Inject 
    private X x;

}
Run Code Online (Sandbox Code Playgroud)

如果我有几个类使用X接口但不同的实现怎么办?

class A {

    @Inject 
    private X x; // should be XDefaultImpl

}

class B {

    @Inject 
    private X x; // should be XSpecialImpl

}
Run Code Online (Sandbox Code Playgroud)

Boz*_*zho 8

使用生产者:

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

    @Produces @DefaultX public X createDefaultX() {
        return new XDefaultImpl();
    }
}
Run Code Online (Sandbox Code Playgroud)

您必须定义@SpecialX@DefaultX限定符.并与它们一起使用@Inject:

@Qualifier
@Retention(..)
@Target(..)
public @interface SpecialX {}
Run Code Online (Sandbox Code Playgroud)

如果您不需要区分两个实现,请跳过限定符部分.