Google Guiceは、オブジェクト間の関係を宣言するだけでオブジェクトを構築できる依存性注入ライブラリです。オブジェクトは、他のオブジェクトを構築するために要求されるとおりに構築されます。Guiceを構成することで、さまざまな実装の抽象クラスまたはインターフェースを実装することもできます。これにより、コードの実行やテストに非常に役立ちます。
@Inject
オブジェクトを初期化する必要があるものを決定するコンストラクターとメソッドに注釈を付けます。Guiceがどのように機能するかを決定する他の多くの注釈もあります。ただし、オブジェクトに注釈を付けるだけでは不十分です。また、 Guiceバインディングを使用してそれらを構成する必要があります。
これは本当に簡単な例です(私のアプリケーションの1つから)。私はMySQLDataTracker
それを必要としMysqlConnectionPoolDataSource
ます:
public class MySQLDataTracker extends ExperimentDataTracker {
@Inject
public MySQLDataTracker(MysqlConnectionPoolDataSource ds) {
....
}
}
MySQLDataTracker
extendsはExperimentDataTracker
、いくつかの方法で実装できる抽象クラスであることに注意してください。Guiceバインディングで、次のように宣言します
bind(ExperimentDataTracker.class).to(MySQLDataTracker.class);
これは、私が欲しいときはいつでもExperimentDataTracker
、MySQLDataTracker
が構築されることを宣言します。また、これを構築するために必要なオブジェクトが使用可能であることを確認する必要があるため、プロバイダーを宣言します。
@Provides @Singleton
MysqlConnectionPoolDataSource getMysqlCPDS() {
return (some thingy I construct...);
}
これは、単一の接続プールデータソースのみが存在する必要があることを示しています。また、のインスタンスを取得しようとするとExperimentDataTracker
、Guiceがそれを構築するために必要なすべてを備えていることも意味します。上記がないとエラーが発生します。
ExperimentDataTracker tracker = injector.getInstance(ExperimentDataTracker.class);
ただし、これだけではありません。他のものはに依存するExperimentDataTracker
ので、他のオブジェクトを注入するために順番に使用されます。私のコードのトップレベルでは、実際にはへの呼び出しは1つだけgetInstance
です。これにより、Guiceはほとんどすべてを構築します。new
私はどこにもステートメントを書く必要はありません。
他のオブジェクトを初期化するために一連のオブジェクトを初期化する必要性がどのように減少したかを見た後、私はGuiceの大ファンです。基本的には、欲しいオブジェクトを要求するだけです。現れる。