如何在不同的CDI-bean实现运行时之间进行选择

时间:2012-12-05 14:33:15

标签: java inversion-of-control cdi jboss-weld

我有一个messageListener,其目的是启动实现Client-interface的客户端。在编译时不知道Client-interface的不同实现。

messageListener使用Launcher-bean启动客户端。所以我的问题是我需要构建一个Launcher-bean,它将选定的Client-interface实现注入其中。我不知道该怎么做,或者我应该以不同方式解决问题?

public class MyMessageConsumer implements MessageListener {
    public void onMessage(Message message) {
        String clientType = message.getClientType();

        //Here i need to construct a launcher-bean, which has the correct Client-implementation injected

        launcher.startClient(message);
    }   
}

public class Launcher {

    @Inject
    private Client client;

    public void startClient(Message message) {
        ...

        client.start(message);
    }

}

编辑:我意识到棘手的部分是找不到正确的实现,但我需要消息消息作为新请求发生。是否有可能理解后续的内容?

1 个答案:

答案 0 :(得分:0)

你想要的是制片人。

这样,您可以将上下文实例的客户端与生成器分开。因此,将它们注入生产者并让它决定使用什么。

为了使其透明并避免模糊依赖,您可以使用@Dynamic限定符生成值。

@Inject
@Dynamic
Foo foo;

..............................

@Produces
@Dynamic
public Foo getFoo() {
//find out what implementation to use and return it  

创建自己的限定符和制作人对谷歌来说非常简单。