1

我注意到 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).

4

1 回答 1

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() {
于 2013-10-01T15:01:27.787 回答