0

让我们声明“ All Rocks have Minerals.”:

public class Mineral
{
    // Nevermind why a Mineral would have a GUID.
    // This is just to show that each Mineral instance
    // is universally-unique.
    String guid;

    @Inject
    public Mineral(String id)
    {
        guid = id;
    }
}

public class Rock
{
    private Mineral mineral;

    @Inject
    public Rock(Mineral min)
    {
        mineral = min;
    }
}

如果我们想要 2 个Rock实例,每个实例都配置了不同的Mineral实例(每个都有自己的 GUID):

public class RockModule extends AbstractModule
{
    public void configure(Binder binder)
    {
        // Make two Minerals with different GUIDs.
        Mineral M1 = new Mineral(UUID.getRandomId().toString());
        Mineral M2 = new Mineral(UUID.getRandomId().toString());

        // Configure two Rocks with these unique Minerals
        Rock R1 = new Rock(M1);
        Rock R2 = new Rock(M2);

        // Define bindings
        bind(Rock.class).toInstance(R1);

        // No way for Guice to expose R2 to the outside world!
    }
}

所以现在,当我们向 Guice 请求 a 时Rock,它总是会给我们一个R1实例,它本身就配置了 的M1实例Mineral

在 Spring DI 中,您可以将两个 bean 定义为相同的类型,但只需给它们不同的 bean ID。然后,您使用它们的 ID 将 bean“连接”在一起。因此,我可以将它们连接在一起,R1并在一起等等。然后,我可以根据需要向 Spring 索取它们。M1R1M2R1R2

使用 Guice,您只能询问您想要的类型Rock.class( ),而不是实例

您如何使用 Guice 请求不同的“有线豆”?通过使用不同的AbstractModule结核?或者这是Guice的限制?

4

2 回答 2

1

我怀疑你想要绑定注释。Guice 不按类型绑定——它通过绑定——但如果你不做任何其他事情,键将只包含类型。绑定注释允许您创建更丰富的键。

链接的文档比我能更好地解释它,但结果是有多种方法可以指定您想要的内容,包括:

@Inject
public Foo(@Named("X") Rock rock)

或者

@Inject
public Foo(@HardRockCafe Rock rock)

在后一种情况下,@HardRockCafe是自定义绑定注释。

于 2012-04-13T13:25:02.013 回答
1

一般来说,这将违反 Guice 的建议。您通常不会new在模块内部创建一个类来创建实例,因为它首先违背了使用 DI 容器的目的。(为什么还要用 注释你的类@Inject?)

相反,您会让 Guice 为您执行此操作:

class RockModule extends AbstractModule {
  public void configure() {}

  @Provides
  @Named("UUID")
  public String getUuid() {
    return UUID.getRandomId().toString();
  }
}

现在每个人都会Mineral自动获得一个唯一的 UUID,并且每个Rock人都会获得一个唯一的Mineral.

这让我们分道扬镳,但是如果您想要在运行时使用两个独特的 Rock 和 Mineral 配对,那么这就是 Guice 所说的“机器人腿”问题,您可以使用私有模块来解决它。请参阅此处的示例。

于 2012-04-15T04:23:33.333 回答