gpt4 book ai didi

java - Guice 在不使用@Singleton 的情况下将单个实例注入(inject)多个对象

转载 作者:搜寻专家 更新时间:2023-11-01 01:21:56 25 4
gpt4 key购买 nike

我在阅读 Guice 文档时,发现了一个标记为 Eliminate the Cycle (Recommended) 的部分这引起了我的兴趣,因为这正是导致我今天阅读文档的问题。

基本上,为了消除循环依赖,您“将依赖项提取到一个单独的类中”。 好的,没有什么新鲜事。

因此,在示例中,我们有。

public class Store {
private final Boss boss;
private final CustomerLine line;
//...

@Inject public Store(Boss boss, CustomerLine line) {
this.boss = boss;
this.line = line;
//...
}

public void incomingCustomer(Customer customer) { line.add(customer); }
}

public class Boss {
private final Clerk clerk;
@Inject public Boss(Clerk clerk) {
this.clerk = clerk;
}
}

public class Clerk {
private final CustomerLine line;

@Inject Clerk(CustomerLine line) {
this.line = line;
}

void doSale() {
Customer sucker = line.getNextCustomer();
//...
}
}

您有一个Store 和一个Clerk,每个都需要引用一个CustomerLine 实例。这个概念没有问题,并且可以通过经典的依赖注入(inject)轻松实现:

CustomerLine customerLine = new CustomerLine();
Clerk clerk = new Clerk(customerLine);
Boss boss = new Boss(clerk);
Store store = new Store(boss, customerLine);

这很简单,但现在,我需要使用 Guice 注入(inject)来完成此操作。因此,我的问题是实现以下内容:

you may want to make sure that the Store and Clerk both use the same CustomerLine instance.

是的,这正是我想要做的。 但我如何在 Guice 模块中做到这一点?

public class MyModule extends AbstractModule implements Module {
@Override
protected void configure() {
//Side Question: Do I need to do this if there if Boss.class is the implementation?
bind(Boss.class);
bind(CustomerLine.class).to(DefaultCustomerLine.class); //impl
}
}

我用我的模块创建了一个注入(inject)器:

Injector injector = Guice.createInjector(new MyModule());

现在,我想要一个 Store 的实例:

Store store = injector.getInstance(Store.class);

这会将 CustomerLineBoss 的新实例注入(inject)到此 Store 实例中。但是,Boss 获取了 Clerk 的实例,该实例还注入(inject)了 CustomerLine 的实例。此时,它将是一个新实例,与注入(inject) Store 的实例不同。

问题重访

  • StoreClerk 如何在此序列中共享同一个实例,不使用 @Singleton?

请让我知道是否需要更多信息,或者这个问题表述不够清楚,我一定会修改。

最佳答案

你应该使用 provider

public class StoreProvider implements Provider<Store> {
@Inject
private Boss boss ;

public Store get() {
return new Store(boss, boss.getClerk().getCustomerLine());
}
}

然后在你的模块中绑定(bind)它

bind(Store.class).toProvider(StoreProvider.class);

关于java - Guice 在不使用@Singleton 的情况下将单个实例注入(inject)多个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18358309/

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