Java 如何在运行时选择不同的CDIBean实现
我有一个messageListener,其目的是启动客户端实现客户端接口。客户机接口的不同实现在编译时是未知的 messageListener使用启动程序bean启动客户端。所以我的问题是,我需要构造一个启动器bean,将选定的客户端接口实现注入其中。我不知道怎么做,或者我应该用不同的方法来解决这个问题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
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)。但每次启动客户机时,我都需要新的客户机实例。所以我想,如果您想在请求之间重用客户机实例,并在启动客户机时拥有一个唯一的实例,那么它应该是会话范围