【发布时间】:2021-07-09 05:41:46
【问题描述】:
我有一个类 Xyz,它被注入到多个类中。我使用 Guice 进行 DI。
class Xyz{
static int i =0;
public Xyz(){
System.out.println("###########creating instance = " + (++i));
}
}
class ManagedOne{
Xyx xyz;
public ManagedOne(Xyz xyz){
this.xyz = xyz;
}
}
class ManagedTwo{
Xyx xyz;
public ManagedTwo(Xyz xyz){
this.xyz = xyz;
}
}
古斯
bind(Xyz.class).in(Singleton.class);
bind(ManageOne.class).in(Singleton.class);
bind(ManageTwo.class).in(Singleton.class);
- 现在,即使我删除了 about 绑定,我仍然可以看到 Guice 正在创建 Xyz 的单例实例。使用 sysout 验证。它只打印一个值为 1 的值。这是默认行为吗?我以为默认是工厂。
- Guice 会在两个管理器中注入相同的 Xyz 实例吗?如果是,那么代码
bind(Xyz.class).in(Singleton.class)是多余的吗?
请注意,我并不总是使用injector.getInstance(Xyz.class) 来获取 Xyz 的实例。相反,我按照上面代码中显示的方式进行操作
【问题讨论】:
-
您没有提供
Xyz的完整和正确定义:您写的第一行是class Xyz() {和(),不应该在这里。所以我猜你调整了显示的代码。同样在删除()之后,我使用var injector = Guice.createInjector(); injector.getInstance(Xyz.class); injector.getInstance(Xyz.class); injector.getInstance(Xyz.class);运行您的代码并得到了预期的结果###########creating instance = 1 ###########creating instance = 2 ###########creating instance = 3因此请提供MCVE -
这是一个示例代码,而不是我在系统中运行的实际代码,因为实际代码非常复杂。我编辑帖子。另请注意,我不使用注射器创建 Xyz 的实例。查看我更新的帖子。
-
默认绑定是针对工厂的;您发布的内容应该有效。请注意,实际上需要自己创建 ManageOne 和 ManageTwo 才能让 Guice 创建 Xyz,因此如果您不注意创建 ManagedOne 和 ManagedTwo 的实例,您将不会看到计数器增加。跨度>
标签: java dependency-injection guice