我正在阅读 Guice 文档,遇到了一个标有消除循环(推荐)的部分,这引起了我的兴趣,因为这正是导致我今天阅读文档的问题。
基本上,为了消除循环依赖,您“将依赖案例提取到一个单独的类中”。好吧,没什么新鲜的。
所以,在这个例子中,我们有。
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();
//...
}
}
您有 aStore
和 aClerk
并且每个都需要引用CustomerLine
. 这个概念没有问题,并且可以通过经典的依赖注入轻松实现:
CustomerLine customerLine = new CustomerLine();
Clerk clerk = new Clerk(customerLine);
Boss boss = new Boss(clerk);
Store store = new Store(boss, customerLine);
这很容易,但是现在,我需要使用 Guice 注入来做到这一点。因此,我的问题是实施以下内容:
您可能希望确保 Store 和 Clerk 都使用相同的 CustomerLine 实例。
是的,这正是我想做的。但是我如何在 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
}
}
我用我的模块创建了一个注入器:
Injector injector = Guice.createInjector(new MyModule());
现在,我想要一个实例Store
:
Store store = injector.getInstance(Store.class);
CustomerLine
这会将 的和的新实例注入Boss
到Store
. Boss
但是,获得一个实例,Clerk
其中也注入了一个CustomerLine
. 此时,它将是一个新实例,与注入的实例不同Store
。
重新审视问题
- 如何在这个序列中共享相同的实例,而不
Store
使用?Clerk
@Singleton
请让我知道是否需要更多信息,或者这个问题的表述不够清楚,我一定会修改。