关于 guice,我有一些不明白的地方:根据我目前所读到的内容,我应该只在我的引导类中使用 Injector(在独立应用程序中,这通常在 main() 方法中) ,如下例所示(取自 guice 文档):
public static void main(String[] args) {
/*
* Guice.createInjector() takes your Modules, and returns a new Injector
* instance. Most applications will call this method exactly once, in their
* main() method.
*/
Injector injector = Guice.createInjector(new BillingModule());
/*
* Now that we've got the injector, we can build objects.
*/
RealBillingService billingService = injector.getInstance(RealBillingService.class);
...
}
但是,如果不是我需要的所有对象都可以在启动期间创建呢?也许我想在应用程序运行时响应一些用户交互?难道我不需要把我的注入(inject)器放在某个地方(例如作为一个静态变量),然后当我需要创建一个新对象时调用 injector.getInstance(SomeInterface.class) 吗?
当然,在整个地方传播对 Injector.getInstance() 的调用似乎是不可取的。
我在这里做错了什么?
最佳答案
是的,您基本上只应该使用 Injector 来创建获取根对象的实例。应用程序的其余部分不应触及 Guice-Container。正如您所注意到的,您仍然需要在需要时创建一些对象。有不同的方法可以做到这一点,每种方法都适合不同的需求。
注入(inject)提供者
Provider是 Guice 的一个界面。它允许您请求对象的新实例。该对象将使用 Guice 创建。例如。
class MyService{
private Provider<Transaction> transactionProvider;
public MainGui(Provider<Transaction> transactionProvider){
this.transactionProvider = transactionProvider;
}
public void actionStarted(){
Transaction transaction = transactionProvider.get();
}
建厂
通常你需要某种工厂。该工厂使用一些注入(inject)的服务和一些参数,并为您创建一个新对象。然后将此工厂用于新实例。然后你注入(inject)那个工厂并使用它。 AssistedInject 对此也有帮助。 -延期
我认为有了这两种可能性,您很少需要使用 Guice-Injector 本身。但有时仍适合使用喷油器本身。然后您可以将 Injector 注入(inject)到组件中。
关于dependency-injection - 使用 guice 时如何避免到处都有 injector.createInstance()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3986858/