0

そのため、ここで見つけた素晴らしい記事に従って、自分でいくつかの注釈を付けて Guice を拡張しようとしています: http://developer.vz.net/2012/02/08/extending-guice-2/

これは、次のことを除いて、私にとってはまったく問題ありません。

モジュールで、これらのサービスの 1 つをインスタンス化します。

  final SchedulerService schedulerService = new SchedulerService();

そして、ここに隠された悪があります。この男は幸運にも、依存関係のない単純なオブジェクトだけが必要でした。しかし、私の場合、Serviceさらに 2 つのサブサービスへの参照が必要です。彼はnewを作成していたので、2 つのサブサービスの両方Serviceに使用する必要があるためnew、作成できるようになります。したがって、一部のプロパティをこれらのサブサービスに挿入することはできません。事実上、私は明確化されていないオブジェクトサブツリー全体を作成しています。

それを回避する方法はありますか?Guice に をインスタンス化しServiceてから に登録させることはできTypeListenerますか?

4

1 に答える 1

2

Injector が存在するまで呼び出さないことを約束する限り、getProvider( BinderおよびAbstractModuleで)モジュール内から注入されたアイテムのプロバイダーに実際にアクセスできます。get(そうすると、IllegalStateExceptionが発生します。)

その時点で、コードは次のようになります。

Provider<YourService> yourServiceProvider = getProvider(YourService.class);
final InjectionListener injectionListener = new InjectionListener() {
  public void afterInjection(Object injectee) {
    yourServiceProvider().get().accept(injectee);
  }
}

ここでの唯一の問題は、サービスとその依存関係を注入すると、InjectionListener もトリガーしようとし、無限ループが発生する可能性があることです。null ガードを追加し、サービスが null である間はすべての注入を無視することで、これを解決できます。ただし、リスナーなしでインジェクターを作成して YourService をブートストラップし、リスナーを子インジェクターに追加することをお勧めします。

Injector injectorWithoutListener = Guice.createInjector(new YourServiceModule());
YourService yourService = injectorWithoutListener.getInstance(YourService.class);
Injector finalInjector = injectorWithoutListener.createChildInjector(
    new YourInjectionListenerModule(yourService), new EverythingElseModule());

親インジェクタでシングルトン動作が設定されたオブジェクトは引き続きそこに作成されるため、 で作成されたfinalInjectorインスタンスは のインスタンスとシングルトン動作を共有することに注意してくださいinjectorWithoutListenercreateChildInjectorバインディング解決順序についても読むことができます。

于 2013-10-24T17:55:50.190 に答える