Google Guice每次都会返回新的实例

时间:2018-05-06 06:48:00

标签: dependency-injection guice

我是Dependency Injection的新手,最近不得不学习Spring和Guice。下面的问题可能非常蹩脚。

Spring允许您使用@Scope(“prototype”)注释创建原型对象,这意味着每次都返回一个新对象

例如在我的弹簧容器中: -

@Scope("prototype")
@Bean
A getA(){
   return new A();
}

在@autowired的所有引用中都注入了一个新对象A.

class B {
  @Autowired
  A objA;
}

然而,在guice注射器中,正在注射相同的实例。看起来guice只提供单例,请求或会话范围https://github.com/google/guice/wiki/Scopes。我的应用程序不完全是一个Web服务,我想知道如何在任何地方注入对象的新实例。我读过提供者可以使用,但找不到任何蹩脚/简单的例子来理解。

我怎样才能将A的新实例注入B或任何其他类?使用Guice,目前我只能在guice容器

中为所有类注入相同的实例
bind(A.Class).toInstance(new A());
new B(); // or create with other ways 

2 个答案:

答案 0 :(得分:2)

所需行为是guice的默认行为,因此每次都会获得一个新实例,除非您明确切换到单例。

这就是你绑定到Instance时所做的事情。你正在告诉他们,有人需要一个A的实例,给他这个(通过' new'""。

如果您只想在构建B时注入新的A,请不要在模块中指定任何行为,只需让A有一个使用@Inject注释的构造函数。

答案 1 :(得分:1)

只使用无绑定

默认绑定在每次注入时都会创建一个新实例。

您不需要声明任何内容:

import com.google.inject.*;

class Main {
  static class B {
    @Inject A a;
  }
  public static void main(String[] args) {
    Injector injector = Guice.createInjector();
    B b1 = injector.getInstance(B.class);
    B b2 = injector.getInstance(B.class);

    System.out.println(b1.a == b2.a); // Prints "false"
  }
}