gpt4 book ai didi

dependency-injection - 使用 guice 时如何避免到处都有 injector.createInstance()?

转载 作者:行者123 更新时间:2023-12-03 23:42:24 24 4
gpt4 key购买 nike

关于 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/

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