Guice是否保证何时创建依赖关系?

时间:2013-09-30 10:30:30

标签: guice

我注意到Guice可能会为提供者注入代理,并推迟构建实际的提供者类,直到使用提供者为止。

public static class Foo {
  private final Provider<Bar> barProvider;

  @Inject
  public Foo(Provider<Bar> barProvider) {
    this.barProvider = barProvider;
  }

  public Bar getBar() {
    return barProvider.get();
  }
}

public static class Bar {
  @Inject
  public Bar() {}
}

public static class BarProvider implements Provider<Bar> {
  public BarProvider() {
    System.out.println("BarProvider constructed");
  }
  @Override
  public Bar get() {
    return null;
  }
}

public static void main(String[] args) {
  Injector injector = Guice.createInjector(new AbstractModule() {
    @Override
    protected void configure() {
      bind(Bar.class).toProvider(BarProvider.class);
    }
  });
  Foo foo = injector.getInstance(Foo.class);
  System.out.println("Foo created by Guice");
  foo.getBar();
}

输出

Foo created by Guice
BarProvider constructed

仅在提供商注入时发生这种情况,还是非提供商注入也会发生这种情况?我知道当出现循环依赖时,Guice确实需要使用代理。但是我担心如果后者是真的,那么Guice不能保证在Injector.getInstance(some_class)结尾处真正构造一切。

1 个答案:

答案 0 :(得分:0)

取决于应用的范围阶段。有一个链接到guice doc描述它http://code.google.com/p/google-guice/wiki/Scopes

好吧,如果你将 Bar.class 绑定为EagerSingleton,那么绑定类会立即实例化,因此应用程序启动会有点延长。

bind(Bar.class).toProvider(BarProvider.class).asEagerSingleton();

输出会有所不同

BarProvider constructed
Foo created by Guice

有三个阶段,您可以在 Guice.createInjector

期间设置它们
Injector injector = Guice.createInjector(Stage.PRODUCTION, new AbstractModule() {