8

唯一のコンストラクターで宣言されたクラスに。の注釈が付けられているのを見てきました@Inject。そして、プロジェクト全体のどこかで1つのコンストラクターが呼び出されているのを見ていません。

したがって、2つの質問:

<1>どういう@Inject意味ですか?(それは何をしますか?コンストラクターに注釈が付けられているのはなぜですか?)

<2>前述のように、コンストラクターが直接呼び出されることはありません。これは、コンストラクターに注釈が付けられているという事実と関係があり@Injectますか?

4

1 に答える 1

14

Google Guiceは、オブジェクト間の関係を宣言するだけでオブジェクトを構築できる依存性注入ライブラリです。オブジェクトは、他のオブジェクトを構築するために要求されるとおりに構築されます。Guiceを構成することで、さまざまな実装の抽象クラスまたはインターフェースを実装することもできます。これにより、コードの実行やテストに非常に役立ちます。

@Injectオブジェクトを初期化する必要があるものを決定するコンストラクターとメソッドに注釈を付けます。Guiceがどのように機能するかを決定する他の多くの注釈もあります。ただし、オブジェクトに注釈を付けるだけでは不十分です。また、 Guiceバインディングを使用してそれらを構成する必要があります。

これは本当に簡単な例です(私のアプリケーションの1つから)。私はMySQLDataTrackerそれを必要としMysqlConnectionPoolDataSourceます:

public class MySQLDataTracker extends ExperimentDataTracker {
    @Inject
    public MySQLDataTracker(MysqlConnectionPoolDataSource ds) {
        ....
    }
}

MySQLDataTrackerextendsはExperimentDataTracker、いくつかの方法で実装できる抽象クラスであることに注意してください。Guiceバインディングで、次のように宣言します

bind(ExperimentDataTracker.class).to(MySQLDataTracker.class);

これは、私が欲しいときはいつでもExperimentDataTrackerMySQLDataTrackerが構築されることを宣言します。また、これを構築するために必要なオブジェクトが使用可能であることを確認する必要があるため、プロバイダーを宣言します。

@Provides @Singleton 
MysqlConnectionPoolDataSource getMysqlCPDS() {
    return (some thingy I construct...);            
}

これは、単一の接続プールデータソースのみが存在する必要があることを示しています。また、のインスタンスを取得しようとするとExperimentDataTracker、Guiceがそれを構築するために必要なすべてを備えていることも意味します。上記がないとエラーが発生します。

ExperimentDataTracker tracker = injector.getInstance(ExperimentDataTracker.class);

ただし、これだけではありません。他のものはに依存するExperimentDataTrackerので、他のオブジェクトを注入するために順番に使用されます。私のコードのトップレベルでは、実際にはへの呼び出しは1つだけgetInstanceです。これにより、Guiceはほとんどすべてを構築します。new私はどこにもステートメントを書く必要はありません。

他のオブジェクトを初期化するために一連のオブジェクトを初期化する必要性がどのように減少したかを見た後、私はGuiceの大ファンです。基本的には、欲しいオブジェクトを要求するだけです。現れる。

于 2013-03-20T22:30:33.463 に答える