我正在阅读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();
//...
}
}
您有一个Store
和一个Clerk
,每个都需要引用的一个实例CustomerLine
。这个概念没有问题,并且可以通过经典的依赖注入轻松实现:
CustomerLine customerLine = new CustomerLine();
Clerk clerk = new Clerk(customerLine);
Boss boss = new Boss(clerk);
Store store = new Store(boss, customerLine);
这很容易,但是现在,我需要通过Guice注入来做到这一点。因此,我的问题是实现以下内容:
您可能要确保商店和文员都使用相同的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
?请让我知道是否需要更多信息,或者这个问题不够清楚,我将进行修订。
您应该使用提供者
public class StoreProvider implements Provider<Store> {
@Inject
private Boss boss ;
public Store get() {
return new Store(boss, boss.getClerk().getCustomerLine());
}
}
然后将其绑定到您的模块中
bind(Store.class).toProvider(StoreProvider.class);
我有一个单例类定义为: 我有另一个类使用这个单例类,但这个类必须使用新操作符创建。因此,我不能使用构造函数注入或setter注入等。 我当然可以将此实例传递到MyClass的构造函数中,但从我的程序上下文来看,这不是一个很好的设计。 另一个解决方案是为MySingletonClass创建一个静态getInstance方法,这样我就可以从程序中的任何地方获取实例。但我想知道Guice是否支持类似的东
我的核心应用程序完成了。我能够成功地加载模块,但我仍然不能正确地使用guice在我的模块中注入依赖项。我的核心应用程序使用service loader生成模块,并使用Guice的AbstractModule的install方法安装它们。下面是一个示例代码:(简化) 每个模块都实现了IModule接口,扩展了Guice的module接口。让我困惑的是,当不建议到处都有注入器时,我如何提供插入实例(例
我们是这样做的: 但是我们有很多类具有as依赖性,我们不想每次创建实例时都添加这些代码。 那么,有没有办法在创建B的实例时自动注入A的实例?
我正在做一个使用依赖注入GoogleGuice框架的项目。 可以将类与singleton作用域绑定在一起,如下所示: 如果类本身是一个真正的单例类: 或者 因此,可以在项目中声明两个单例,第一个由Guice声明,第二个由传统方式声明。 Google Guice还可以使用方法将Interface绑定到特定实例。 因此,在Java中,用以下声明绑定Singleton,而不是绑定Singleton作用域
我有一个已有的名为Legacy的类,它大部分是用旧学校的单例模式编写的。现在我想介绍一个新的领域,我想使用Guice。Legacy本身不受Guice控制,它由另一个服务类使用(在服务类内部,它调用Legacy类的getInstance()来检索Legacy对象),并且该服务类是使用Guice注入器创建的。 我尝试的是将方法注入到Legacy类中 并且在服务的模块文件中,我绑定了NewField对象
免责声明:我读了以下关于JDK动态代理和CGLIB的文章:https://stackoverflow.com/a/21762454/2674303 我读过以下有趣的文章:将Spring原型bean注入单例bean 原型: 测试: 很明显,测试失败了,因为注射只发生一次,实际结果是1,但我们预期是2。 第二种情况: 当我们开始测试时,我们看到实际结果是6,因为内部方法messageBuilder被访