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

发布于 2024-09-03 21:31:42 字数 360 浏览 11 评论 0原文

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

示例:

接口 X 及其实现来自第三方库。我如何决定使用哪个实现?

class A {

    @Inject 
    private X x;

}

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

class A {

    @Inject 
    private X x; // should be XDefaultImpl

}

class B {

    @Inject 
    private X x; // should be XSpecialImpl

}

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

}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

壹場煙雨 2024-09-10 21:31:42

使用生产者:

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

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

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

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

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

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文