引导 Guice 注入器
Bootstrapping Guice injector
我有一个场景,我需要在开始时注入一些对象,例如日志记录,然后再按需注入其他对象。我不知道的是,如果在我的控制台应用程序中,我是否只调用:
Guice.createInjector(....)
在我的 Main 函数中,然后当我需要另一个对象时,我需要的类型,我是否使用 Provider 再次注入同一个对象?我很难找到在这种情况下使用 Guice 注入器的最佳方法。
一般来说,是的:注入一个 Provider
以便稍后获取您的对象,并且不要在必要时直接持有您的 Injector。
理想情况下,您的 bootstrap 应该是:它应该实例化您的注入器并获得某种完整的应用程序 实例 。这一点特别重要,因为 Guice 有助于测试,因此将应用程序中受制于 Guice 的部分最大化是一个好主意。
public class YourApplication {
public static void main(String[] args) {
// Only three lines exist outside the object graph.
Injector injector = Guice.createInjector(new YourModule1(), new YourModule2());
YourApplication app = injector.getInstance(YourApplication.class);
app.run();
}
@Inject Provider<YourDep1> depProvider1;
@Inject YourDep2 dep2;
public void run() {
// Here you have access to every @Inject field.
}
}
在这里,请记住,您创建的 Injector 仅保存在堆栈中。这是因为您可以从 @Inject
注释的字段、方法和构造函数中获得所需的一切,包括 Injector 本身。正如您所建议的,您可以使用 Provider
来获取所需数量的实例,如果该代码路径中不需要该对象,则包括零个实例。
我有一个场景,我需要在开始时注入一些对象,例如日志记录,然后再按需注入其他对象。我不知道的是,如果在我的控制台应用程序中,我是否只调用:
Guice.createInjector(....)
在我的 Main 函数中,然后当我需要另一个对象时,我需要的类型,我是否使用 Provider 再次注入同一个对象?我很难找到在这种情况下使用 Guice 注入器的最佳方法。
一般来说,是的:注入一个 Provider
以便稍后获取您的对象,并且不要在必要时直接持有您的 Injector。
理想情况下,您的 bootstrap 应该是:它应该实例化您的注入器并获得某种完整的应用程序 实例 。这一点特别重要,因为 Guice 有助于测试,因此将应用程序中受制于 Guice 的部分最大化是一个好主意。
public class YourApplication {
public static void main(String[] args) {
// Only three lines exist outside the object graph.
Injector injector = Guice.createInjector(new YourModule1(), new YourModule2());
YourApplication app = injector.getInstance(YourApplication.class);
app.run();
}
@Inject Provider<YourDep1> depProvider1;
@Inject YourDep2 dep2;
public void run() {
// Here you have access to every @Inject field.
}
}
在这里,请记住,您创建的 Injector 仅保存在堆栈中。这是因为您可以从 @Inject
注释的字段、方法和构造函数中获得所需的一切,包括 Injector 本身。正如您所建议的,您可以使用 Provider
来获取所需数量的实例,如果该代码路径中不需要该对象,则包括零个实例。