0

我有一个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);
    }

}

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

4

1 回答 1

0

你想要的是一个制作人。

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

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

@Inject
@Dynamic
Foo foo;

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

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

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

于 2012-12-07T18:19:56.457 回答