Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在运行时选择不同的CDIBean实现_Java_Inversion Of Control_Cdi_Jboss Weld - Fatal编程技术网

Java 如何在运行时选择不同的CDIBean实现

Java 如何在运行时选择不同的CDIBean实现,java,inversion-of-control,cdi,jboss-weld,Java,Inversion Of Control,Cdi,Jboss Weld,我有一个messageListener,其目的是启动客户端实现客户端接口。客户机接口的不同实现在编译时是未知的 messageListener使用启动程序bean启动客户端。所以我的问题是,我需要构造一个启动器bean,将选定的客户端接口实现注入其中。我不知道怎么做,或者我应该用不同的方法来解决这个问题 public class MyMessageConsumer implements MessageListener { public void onMessage(Message mes

我有一个messageListener,其目的是启动客户端实现客户端接口。客户机接口的不同实现在编译时是未知的

messageListener使用启动程序bean启动客户端。所以我的问题是,我需要构造一个启动器bean,将选定的客户端接口实现注入其中。我不知道怎么做,或者我应该用不同的方法来解决这个问题

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);
    }

}

编辑:我意识到棘手的部分不是找到正确的实现,而是我需要消息的使用作为新请求发生。你能理解我想要什么吗?

你想要的是制片人

通过这种方式,可以分离上下文实例的客户端和生产者。因此,将它们注入生产商,让其决定使用什么

为了使其透明并避免不明确的依赖关系,您可以使用@Dynamic qualifier生成一个值

@Inject
@Dynamic
Foo foo;

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

创建您自己的限定符和生产者对google来说非常简单。

如果您有一小部分
客户机
实现,您可以将它们全部注入侦听器,选择正确的实现并将其传递给
启动器
构造函数。或者,您甚至可以将其作为第二个参数传递给
startClient
method。现在您已经说出了它,这是显而易见的。从未想过让听者接受管理。应该很简单。但是当我仔细考虑它时,真正的问题是我只有一个MessageListener实例(所以我想这会使它@ApplicationScope)。但每次启动客户机时,我都需要新的客户机实例。所以我想,如果您想在请求之间重用客户机实例,并在启动客户机时拥有一个唯一的实例,那么它应该是会话范围