2

Guice がモジュールの @Provider メソッドを無視しているようです。

次のようなクラス MyModule があります。

public class MyModule extends AbstractModule {

    protected void configure() {

        bindInterceptor(Matchers.any(), Matchers.annotatedWith(Timed.class), new GuiceEnabledLoggingInterceptor());
        bind(OneClass.class).to(OneClassImpl.class);

        // And more binding lines...

    }

    @Provides
    public AnotherClassInApi provideMyClass() {
        return AnotherClassInApi.getInstance();
    }

    // And more @Provides methods

}

主な方法は

public static void main(String[] args){
    ConfigHandler.getInstance().loadConfigWhenNotRunningInsideMicrocontainer();
    Injector INJECTOR = Guice.createInjector(new MyModule());
    // ...
}

プロジェクトの他の部分には、AnotherClassInApi クラスがあります。これは、非常に標準的なシングルトンと 1 つのメソッドです。

public class AnotherClassInApi {

    private static final AnotherClassInApi INSTANCE = new AnotherClassInApi();

    private AnotherClassInApi() { }

    // ... more methods

    public static AnotherClassInApi getInstance() {
        return INSTANCE;
    }
}

まあ、AnotherClassInApi オブジェクトに対するすべてのリクエストを getInstance() メソッドに効果的にバインドする必要があることは理解していますが、機能しません。面白いことに、デバッグ中に @Provide メソッドのブレークポイントに到達することはありませんが、configure メソッドのブレークポイントに到達します。guice がプロバイダーの注釈を無視しているようです。Guice ガイドが @Provider について述べていることを正確にフォローしていると思うので、すでに立ち往生しています。

ぐぐってみましたが、似たようなものは見つかりませんでした。どんな助けでも大歓迎です。

ありがとう!

4

1 に答える 1

2

プロバイダー (および @Provides メソッド) の概念は、実際に必要な場合にのみ呼び出されるというものです。そのため、インジェクターを実際に使用して @Inject 依存関係を持つインスタンスを作成しない限り、プロバイダーは無視されず、使用されません (必要もありません)。

「 inspector.getAllBindings() 」を使用して、構成されたすべてのバインディングを監視できます。

java.util.Map,Binding> getAllBindings()

このインジェクターのバインディングのスナップショットを、明示的およびジャストインタイムの両方で返します。返されるマップは不変です。getAllBindings() が呼び出されたときに存在していたバインディングのみが含まれます。ジャストインタイム バインディングは、少なくとも 1 回要求された場合にのみ存在します。後続の呼び出しは、追加のジャストインタイム バインディングを含むマップを返す場合があります。返されるマップには、親インジェクターから継承されたバインディングは含まれません (存在する場合)。

このメソッドは Guice SPI の一部であり、ツールや拡張機能で使用するためのものです。

于 2012-07-30T20:02:25.907 に答える