guice默认绑定单例还是工厂?

qnakjoqk  于 2021-08-20  发布在  Java
关注(0)|答案(1)|浏览(364)

我有一个类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);

现在,即使我删除了about绑定,我仍然看到guice正在创建xyz的单例示例。使用sysout进行验证。它只打印一个值为1的。这是默认行为吗?我以为违约是工厂。
guice会在两个管理器中注入相同的xyz示例吗?如果是,代码是什么 bind(Xyz.class).in(Singleton.class) 那是多余的吗?
请注意,我不使用 injector.getInstance(Xyz.class) 始终获取xyz的示例。相反,我是按照上面代码中显示的方式来做的

i1icjdpr

i1icjdpr1#

我看不出有什么问题。
鉴于此 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,准确地展示你的问题,而不是含糊其辞地解释。

相关问题