【发布时间】:2012-12-05 14:33:15
【问题描述】:
我有一个messageListener,目的是启动客户端实现客户端接口。客户端接口的不同实现在编译时是未知的。
messageListener 使用 Launcher-bean 来启动客户端。所以我的问题是我需要构建一个 Launcher-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);
}
}
编辑:我意识到棘手的部分不是找到正确的实现,而是我需要消息的消费作为新请求发生。能不能看懂我在追求什么?
【问题讨论】:
-
如果您有少量的
Client实现,您可以将它们全部注入您的监听器,选择正确的实现并将其传递给Launcher构造函数。或者你甚至可以将它作为第二个参数传递给startClient方法 -
既然你这么说,那是显而易见的。从来没有想过让听众管理。应该很简单。
-
但是当我仔细考虑它时,真正的问题是我只有一个 MessageListener 实例(所以我想这会使其成为@ApplicationScoped)。但是每次启动客户端时,我都需要新的客户端实例。所以我想那些范围较小(请求或会话)
-
如果你想在请求之间重用客户端实例并且每次启动客户端时都有一个唯一的实例,那么它应该是会话范围
标签: java inversion-of-control cdi jboss-weld