gpt4 book ai didi

java - 私有(private)模块和/或提供程序的简单使用

转载 作者:太空宇宙 更新时间:2023-11-04 06:59:18 24 4
gpt4 key购买 nike

刚接触 Guice,所以我正在研究它的表达能力。假设我有如下类(class):

public class Data {
@Inject
public Data(@Named("First") String first, @Named("Second") String second) { ... }
}

public class DataUser1 {
@Inject
public DataUser1(Data data) { ... }
}

public class DataUser2 {
@Inject
public DataUser2(Data data) { ... }
}

如何创建一个模块,以便当我调用 injector.getInstance(DataUser1.class) 时,我会得到相当于 new DataUser1(new Data("foo", "bar")) 的东西,而拥有 injector.getInstance(DataUser2.class) 时,我会得到相当于 new DataUser2(new Data("foo2", "bar2")) 的东西?

同样相关的是,如何创建一个模块,我可能需要获取两个 DataUser1 实例,每个实例使用不同的 Data 值?

最佳答案

您使用 private modules用于创建几乎相同但在特定细节上有所不同的对象的图表。

public class DataUser1Module extends PrivateModule {
@Override
protected void configure() {
bindConstant().annotatedWith(Names.named("First")).to("foo");
bindConstant().annotatedWith(Names.named("Second")).to("bar");

bind(Data.class);
bind(DataUser1.class);

expose(DataUser1.class);
}
}

public class DataUser2Module extends PrivateModule {
@Override
protected void configure() {
bindConstant().annotatedWith(Names.named("First")).to("foo2");
bindConstant().annotatedWith(Names.named("Second")).to("bar2");

bind(Data.class);
bind(DataUser2.class);

expose(DataUser2.class);
}
}

Injector injector = Guice.createInjector(new DataUser1Module(), new DataUser2Module());
DataUser1 dataUser1 = injector.getInstance(DataUser1.class);
DataUser2 dataUser2 = injector.getInstance(DataUser2.class);

如果您需要两个具有不同 DataDataUser1 实例,您可以执行相同的操作,但可以使用注释来区分它们:

public class DataUser1Module1 extends PrivateModule {
@Override
protected void configure() {
bindConstant().annotatedWith(Names.named("First")).to("foo");
bindConstant().annotatedWith(Names.named("Second")).to("bar");

bind(Data.class);
bind(DataUser1.class).annotatedWith(Names.named("1")).to(DataUser1.class);

expose(DataUser1.class).annotatedWith(Names.named("1"));
}
}

public class DataUser1Module2 extends PrivateModule {
@Override
protected void configure() {
bindConstant().annotatedWith(Names.named("First")).to("foo2");
bindConstant().annotatedWith(Names.named("Second")).to("bar2");

bind(Data.class);
bind(DataUser1.class).annotatedWith(Names.named("2")).to(DataUser1.class);

expose(DataUser1.class).annotatedWith(Names.named("2"));
}
}

Injector injector = Guice.createInjector(new DataUser1Module1(), new DataUser1Module2());
DataUser1 dataUser11 = injector.getInstance(Key.get(DataUser1.class, Names.named("1"));
DataUser1 dataUser12 = injector.getInstance(Key.get(DataUser1.class, Names.named("2"));

这个模式是 described在 Guice 常见问题解答中。

另请参阅以下问题:

关于java - 私有(private)模块和/或提供程序的简单使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22344721/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com