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

3 つの段階があり、 Guice.createInjector中に設定できます。

Injector injector = Guice.createInjector(Stage.PRODUCTION, new AbstractModule() {
于 2013-10-01T15:01:27.787 に答える