具有可配置混凝土类的Guice模块

时间:2012-02-15 20:39:23

标签: java guice

如果我的客户定义如下: -

public interface Client {
    void send(String message);
}

实施如下: -

final class SocketClient {

    private Integer port;

    @Inject
    SocketClient(Integer port) {
        this.port = port;
    }

    @Override
    public void send(String message) {
        System.out.println("Sending message:- "+message+" to port "+port);
    }
}

我如何使用Guice实例化SocketClient的多个实例,每个实例连接到不同的端口?

2 个答案:

答案 0 :(得分:2)

首先想到的解决方案是创建一个看起来像

SocketClientFactory界面
interface SocketClientFactory {
  SocketClient createForPort(int port);
}

然后使用assisted injection extension获取工厂实例。

答案 1 :(得分:1)

你必须实现类似单例PortAllocator的东西,它跟踪它已经分配的端口。然后,您可以将其注入您的客户端:

@Inject
SocketClient(PortAllocator portAllocator) {
  this.port = portAllocator.allocatePort();
}

PortAllocator可能类似于:

@Singleton
class PortAllocator {
  private int nextPort = 1234;

  int allocatorPort() {
    return nextPort++;
  }
}

如果您愿意,可以使用界面分离。您可能也想考虑线程安全性。

你可能会说你在这里没有从Guice那里得到太多东西,但是你正在进行内置的单一状态管理,缺乏静力学使得测试变得容易。