【发布时间】:2012-04-13 13:15:26
【问题描述】:
让我们声明“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 请求 Rock 时,它总是会给我们 R1 实例,它本身配置有 Mineral 的 M1 实例。
在 Spring DI 中,您可以将两个 bean 定义为相同的类型,但只需给它们不同的 bean ID。然后,您使用它们的 ID 将 bean“连接”在一起。所以我可以将R1 和M1 连接在一起,将R1 和M2 连接在一起,等等。然后,我可以根据需要向Spring 询问R1 或R2。
使用 Guice,您只能询问您想要的 type (Rock.class),而不是 instance。
您如何使用 Guice 请求不同的“有线豆”?通过使用不同的AbstractModule 凝结物?或者这是 Guice 的限制?
【问题讨论】:
标签: java spring dependency-injection guice