代码之家  ›  专栏  ›  技术社区  ›  Matt

获取同一类型的多个guice单件

  •  12
  • Matt  · 技术社区  · 15 年前

    你能得到两个相同底层类型的单实例吗?

    这在Spring中显然是微不足道的,因为它基于您附加作用域的命名实例,但我看不到guice中关于将类型绑定到实现类的等价物。注意,我不希望绑定到实例,因为所讨论的实例通过guice注入了其他依赖项。

    2 回复  |  直到 7 年前
        1
  •  16
  •   Marcin    15 年前

    伪装也很容易!创建两个biding注释,例如 @One @Two 然后

    bind(MySingleton.class).annotatedWith(One.class).toInstance(new MySingleton());
    bind(MySingleton.class).annotatedWith(Two.class).toInstance(new MySingleton());
    

    然后

    @Inject
    public SomethingThatDependsOnSingletons(@One MySingleton s1,
        @Two MySingleton t2) { ... }
    
        2
  •  15
  •   Etienne Neveu    7 年前

    我想补充一下马金的回答,你不必限制自己使用 toInstance() 或者在这种情况下提供方法。

    以下内容也同样有效:

    bind(Person.class).annotatedWith(Driver.class).to(MartyMcFly.class).in(Singleton.class);
    bind(Person.class).annotatedWith(Inventor.class).to(DocBrown.class).in(Singleton.class);
    

    […]

    @Inject
    public BackToTheFuture(@Driver Person marty, @Inventor Person doc) { ... }
    

    在实例化martymcfly和docbrown类时,guice将像往常一样注入依赖项。


    请注意,当您希望绑定多个 同类型 :

    bind(Person.class).annotatedWith(Driver.class).to(Person.class).in(Singleton.class);
    bind(Person.class).annotatedWith(Inventor.class).to(Person.class).in(Singleton.class);
    

    为了使这项工作有效,你必须确保 Person 未在singleton范围内绑定,或者在guice模块中明确绑定,或者使用 @Singleton 注释。更多细节 this Gist .

    编辑: 作为示例,我给出的示例代码来自 Guice Grapher Test . 查看guice测试是更好地理解如何使用API的一个很好的方法(它也适用于具有良好单元测试的每个项目)。