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

标签 dependency-injection guice

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

相关文章:

unit-testing - 如何在 erlang 中进行依赖注入(inject)和模拟?

java - 使用 Mockito 通过一系列依赖类注入(inject) Mock

java - Guice - 字段注入(inject)限制

java - 绑定(bind)同一个接口(interface)两次(Guice)

java - 如果没有 Servlet API,Guice Servlet 配置将无法工作

java - 作为身份功能实现的 Guice-Provider 如何工作?

ios - 台风从 Storyboard 中将属性注入(inject) View Controller

java - Guice - 如何创建一个没有参数构造函数单例的类并让变量自动注入(inject)?

java - Servlet 的 Google guice 注入(inject)器返回 500 错误

scala - 如何在 Scala/SBT 中安装 Guice?