【问题标题】:Guice default binding singleton or factory?Guice 默认绑定单例还是工厂?
【发布时间】:2021-07-09 05:41:46
【问题描述】:

我有一个类 Xyz,它被注入到多个类中。我使用 Guice 进行 DI。

    class Xyz{
        
        static int i =0;
        
        public Xyz(){
          System.out.println("###########creating instance = " + (++i));
        }
    }
   

    class ManagedOne{
    
         Xyx xyz;
        
        public ManagedOne(Xyz xyz){
         this.xyz = xyz;
        }
    }

    class ManagedTwo{
    
        Xyx xyz;
    
        public ManagedTwo(Xyz xyz){
         this.xyz = xyz;
        }
    }

古斯

  bind(Xyz.class).in(Singleton.class);
  bind(ManageOne.class).in(Singleton.class);
  bind(ManageTwo.class).in(Singleton.class);
  
  1. 现在,即使我删除了 about 绑定,我仍然可以看到 Guice 正在创建 Xyz 的单例实例。使用 sysout 验证。它只打印一个值为 1 的值。这是默认行为吗?我以为默认是工厂。
  2. Guice 会在两个管理器中注入相同的 Xyz 实例吗?如果是,那么代码bind(Xyz.class).in(Singleton.class) 是多余的吗?

请注意,我并不总是使用injector.getInstance(Xyz.class) 来获取 Xyz 的实例。相反,我按照上面代码中显示的方式进行操作

【问题讨论】:

  • 您没有提供Xyz 的完整和正确定义:您写的第一行是class Xyz() {(),不应该在这里。所以我猜你调整了显示的代码。同样在删除() 之后,我使用var injector = Guice.createInjector(); injector.getInstance(Xyz.class); injector.getInstance(Xyz.class); injector.getInstance(Xyz.class); 运行您的代码并得到了预期的结果###########creating instance = 1 ###########creating instance = 2 ###########creating instance = 3 因此请提供MCVE
  • 这是一个示例代码,而不是我在系统中运行的实际代码,因为实际代码非常复杂。我编辑帖子。另请注意,我不使用注射器创建 Xyz 的实例。查看我更新的帖子。
  • 默认绑定是针对工厂的;您发布的内容应该有效。请注意,实际上需要自己创建 ManageOne 和 ManageTwo 才能让 Guice 创建 Xyz,因此如果您不注意创建 ManagedOne 和 ManagedTwo 的实例,您将不会看到计数器增加。跨度>

标签: java dependency-injection guice


【解决方案1】:

我没有发现任何问题。

鉴于countstatic,请确保您的整个应用程序没有被调用两次,并且您没有多个注入器或类似的东西。甚至你不会手动拨打new Xyz()

我将两个测试合二为一。 Abc 没有用@Singleton 注释,而Xyz@Singleton 注释。

import com.google.inject.*;

public class Main {

  public static void main(String[] args)  {
    var injector = Guice.createInjector();
    var module1 = injector.getInstance(Module1.class);
    var module2 = injector.getInstance(Module2.class);
    if (module1.abc == module2.abc) {
      System.out.println("Only one instance of Abc");
    } else {
      System.out.println("Two instances of Abc");
    }
    if (module1.xyz == module2.xyz) {
      System.out.println("Only one instance of Xyz");
    } else {
      System.out.println("Two instances of Xyz");
    }
  }

  static class Abc {
    static int count = 0;
    Abc() { System.out.println("Abc #" + ++count); }
  }

  @Singleton static class Xyz {
    static int count = 0;
    Xyz() { System.out.println("Xyz #" + ++count); }
  }

  @Singleton static class Module1 {
    final Abc abc;
    final Xyz xyz;
    @Inject Module1(Abc abc, Xyz xyz) { this.abc = abc; this.xyz = xyz; }
  }

  @Singleton static class Module2 {
    final Abc abc;
    final Xyz xyz;
    @Inject Module2(Abc abc, Xyz xyz) { this.abc = abc; this.xyz = xyz; }
  }

}

结果如下:

Abc #1
Xyz #1
Abc #2
Two instances of Abc
Only one instance of Xyz

如果这不能回答您的问题,请发送MCVE,准确地展示您的问题,而不是模糊地解释。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    • 1970-01-01
    • 2012-10-20
    • 2016-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多