Guice-quick-guide
Google Guice-概要
Guiceは、オープンソースのJavaベースの依存性注入フレームワークです。 これは軽量であり、Googleによって開発および管理されています。 この章では、Guiceフレームワークの概要を説明します。
依存性注入
すべてのJavaベースのアプリケーションには、連携して動作し、エンドユーザーが動作しているアプリケーションと見なすものを提示するオブジェクトがいくつかあります。 複雑なJavaアプリケーションを記述する場合、アプリケーションクラスは他のJavaクラスから可能な限り独立している必要があります。これにより、これらのクラスを再利用し、ユニットテスト中に他のクラスとは独立してテストできるようになります。 依存性注入(またはワイヤリングと呼ばれることもあります)は、これらのクラスを接着し、同時にそれらを独立した状態に保つのに役立ちます。
テキストエディタコンポーネントを備えたアプリケーションがあり、スペルチェックを提供したいと考えています。 標準コードは次のようになります-
ここで、TextEditorとSpellCheckerの間に依存関係が作成されていることに注意してください。 制御の反転シナリオでは、代わりにこのようなことをします-
ここでは、TextEditorはSpellCheckerの実装について心配するべきではありません。 SpellCheckerは独立して実装され、TextEditorのインスタンス化時にTextEditorに提供されます。
Guiceを使用した依存性注入(バインディング)
依存性注入は、Guice Bindingsによって制御されます。 Guiceはバインディングを使用して、オブジェクトタイプを実際の実装にマップします。 これらのバインディングはモジュールとして定義されます。 モジュールは、以下に示すようにバインディングのコレクションです-
インジェクタはオブジェクトグラフビルダであり、モジュールはそのコアビルディングブロックです。 したがって、最初のステップは、インジェクターを作成し、インジェクターを使用してオブジェクトを取得することです。
上記の例では、TextEditorクラスオブジェクトグラフはGuiceによって構築され、このグラフにはTextEditorオブジェクトとその依存関係がWinWordSpellCheckerオブジェクトとして含まれています。
Google Guice-環境設定
Guiceの機能を検討する前に、Guiceの環境設定について見ていきましょう。
ローカル環境のセットアップ
このセクションでは、マシンにJava環境をダウンロードしてセットアップする方法について説明します。 環境をセットアップするには、以下の手順に従ってください。
Java SEは、https://java.sun.com/javase/downloads/index_jdk5.jsp [Javaのダウンロード]リンクから無料で入手できます。 オペレーティングシステムに基づいてバージョンをダウンロードします。 次に、指示に従ってJavaをダウンロードし、.exeファイルを実行してJavaをマシンにインストールします。 Javaをインストールしたら、正しいインストールディレクトリを指すように環境変数を設定する必要があります。
Windows 2000/XPのパスのセットアップ
_c:\ Program Files \ java \ jdk_ディレクトリにJavaがインストールされていると想定しています-
- 「マイコンピュータ」を右クリックして、「プロパティ」を選択します。
- 「詳細」タブの下の「環境変数」ボタンをクリックします。
- ここで、「Path」変数を変更して、Java実行可能ファイルへのパスも含まれるようにします。 たとえば、パスが現在 'C:\ WINDOWS \ SYSTEM32' に設定されている場合、パスを 'C:\ WINDOWS \ SYSTEM32; c:\ Program Files \ java \ jdk \ bin' に変更します。
Windows 95/98/MEのパスのセットアップ
場合は、Javaを c:\ Program Files \ java \ jdkdirectory にインストールし、 'C:\ autoexec.bat' ファイルを編集して、最後に次の行を追加します:* 'SET PATH =%PATH% ; C:\ Program Files \ java \ jdk \ bin '*。
Linux、UNIX、Solaris、FreeBSDのパスのセットアップ
環境変数PATHは、Javaバイナリがインストールされている場所を指すように設定する必要があります。 詳細については、シェルのドキュメントを参照してください。
たとえば、シェルとして bash を使用する場合、次の行を最後に追加します。 '。bashrc:export PATH =/path/to/java:$ PATH'
人気のあるJavaエディター
Javaプログラムを作成するには、テキストエディターが必要です。 市場には多くの洗練されたIDEがあります。 しかし、今のところ、次のいずれかを検討することができます-
- メモ帳-Windowsマシンでは、メモ帳(このチュートリアルで推奨)、TextPadなどの単純なテキストエディタを使用できます。
- Netbeans -これは、オープンソースで無料のJava IDEであり、https://www.netbeans.org/indexlからダウンロードできます。
- Eclipse -また、eclipseオープンソースコミュニティによって開発されたJava IDEであり、https://www.eclipse.org/からダウンロードできます。
Google Guice環境
Google Guiceの最新バージョンと関連するjarファイルをダウンロードします。
このチュートリアルを書いている時点で、C:\> Googleフォルダーにコピーしました。
OS | Archive name |
---|---|
Windows | guice-4.1.0.jar;aopalliance-1.0.jar;guava-16.0.1.jar;javax.inject-1.jar |
Linux | guice-4.1.0.jar;aopalliance-1.0.jar;guava-16.0.1.jar;javax.inject-1.jar |
Mac | guice-4.1.0.jar;aopalliance-1.0.jar;guava-16.0.1.jar;javax.inject-1.jar |
CLASSPATH変数を設定する
Guice jarの場所を指すように CLASSPATH 環境変数を設定します。 次のように、さまざまなオペレーティングシステムのGoogleフォルダにGuiceと関連するjarを保存していると仮定します。
OS | Output |
---|---|
Windows | Set the environment variable CLASSPATH to %CLASSPATH%;C:\Google\guice-4.1.0.jar;C:\Google\aopalliance-1.0.jar;C:\Google\guava-16.0.1.jar;C:\Google\javax.inject-1.jar;.; |
Linux | export CLASSPATH=$CLASSPATH:Google/guice-4.1.0.jar:Google/aopalliance-1.0.jar:Google/guava-16.0.1.jar:Google/javax.inject-1.jar:. |
Mac | export CLASSPATH=$CLASSPATH:Google/guice-4.1.0.jar:Google/aopalliance-1.0.jar:Google/guava-16.0.1.jar:Google/javax.inject-1.jar:. |
Google Guice-最初のアプリケーション
Guiceバインディングメカニズムを使用して依存関係の注入を段階的に示すサンプルコンソールベースのアプリケーションを作成しましょう。
- ステップ1 *-インターフェースの作成
- ステップ2 *-実装の作成
- ステップ3 *-バインディングモジュールの作成
- ステップ4 *-依存関係を持つクラスを作成する
- ステップ5 *-インジェクターを作成する
- ステップ6 *-依存関係が満たされたオブジェクトを取得する
- ステップ7 *-オブジェクトを使用する
完全な例
GuiceTesterという名前のJavaクラスを作成します。
出力
ファイルをコンパイルして実行すると、次の出力が表示されます。
Google Guice-リンクバインディング
リンクバインディングでは、Guiceは型をその実装にマップします。 以下で説明する例では、SpellCheckerインターフェースをその実装 SpellCheckerImpl にマッピングしています。
具象クラスをそのサブクラスにマッピングすることもできます。 以下の例を参照してください-
ここでバインディングを連鎖していることに注目してください。 完全な例で結果を見てみましょう。
完全な例
GuiceTesterという名前のJavaクラスを作成します。
出力
ファイルをコンパイルして実行すると、次の出力が表示されます。
Google Guice-注釈のバインド
型をその実装にバインドできるため。 複数の実装を持つ型をマップする場合、カスタムアノテーションも作成できます。 概念を理解するには、以下の例を参照してください。
バインディングアノテーションを作成する
- @ BindingAnnotation -注釈をバインディング注釈としてマークします。
- @ Target -注釈の適用可能性を示します。
- @ Retention -アノテーションの可用性をランタイムとしてマークします。
バインディングアノテーションを使用したマッピング
バインディングアノテーションを使用して注入する
完全な例
GuiceTesterという名前のJavaクラスを作成します。
出力
次に、ファイルをコンパイルして実行します。 次の出力を見ることができます-
Google Guice-@Named Binding
Guiceは、カスタムアノテーションを作成せずにバインディングをマップする別の方法も提供します。 @Namedアノテーションを使用することができます。
名前付き注釈を使用したマッピング
@Named注釈を使用して注入する
完全な例
GuiceTesterという名前のJavaクラスを作成します。
出力
次に、ファイルをコンパイルして実行します。 次の出力を見ることができます-
Google Guice-定数バインディング
Guiceは、値オブジェクトまたは定数を使用してバインディングを作成する方法を提供します。 JDBC URLを設定する場合を考えてください。
@Named注釈を使用して注入する
これは、* toInstance()*メソッドを使用して達成できます。
完全な例
GuiceTesterという名前のJavaクラスを作成します。
出力
次に、ファイルをコンパイルして実行します。 次の出力を見ることができます-
Google Guice-@Providesアノテーション
Guiceは、 @ provides メソッドを使用して、複雑なオブジェクトとのバインディングを作成する方法を提供します。
このメソッドはバインディングモジュールの一部であり、マッピングされる複雑なオブジェクトを提供します。 下記の完全な例を参照してください。
完全な例
GuiceTesterという名前のJavaクラスを作成します。
出力
次に、ファイルをコンパイルして実行します。 次の出力を見ることができます-
Google Guice-プロバイダークラス
@providesメソッドがより複雑になると、Providerインターフェイスを使用してこのメソッドを別のクラスに移動できます。
次に、プロバイダーをタイプにマップする必要があります。
下記の完全な例を参照してください。
完全な例
GuiceTesterという名前のJavaクラスを作成します。
出力
次に、ファイルをコンパイルして実行します。 次の出力を見ることができます-
Google Guice-コンストラクターバインディング
Guiceは、* toConstructor()*メソッドを使用して、オブジェクトの特定のコンストラクターでバインディングを作成する方法を提供します。
下記の完全な例を参照してください。
完全な例
GuiceTesterという名前のJavaクラスを作成します。
出力
次に、ファイルをコンパイルして実行します。 次の出力を見ることができます-
Google Guice-組み込みのバインディング
Guiceは java.util.logging.Logger クラスの組み込みバインディングを提供します。 ロガーの名前は、ロガーが挿入されるクラスの名前に自動的に設定されます。 下記の例をご覧ください。
例
GuiceTesterという名前のJavaクラスを作成します。
出力
次に、ファイルをコンパイルして実行します。 次の出力を見ることができます-
Google Guice-ジャストインタイムバインディング
バインディングはBinding Moduleで定義されているため、Guiceは依存関係を注入する必要がある場合は常にバインディングを使用します。 バインディングが存在しない場合、ジャストインタイムバインディングの作成を試みることができます。 バインディングモジュールに存在するバインディングは*明示的バインディング*と呼ばれ、優先順位が高くなりますが、ジャストインタイムバインディングは*暗黙的バインディング*と呼ばれます。 両方のタイプのバインディングが存在する場合、明示的なバインディングがマッピングのために考慮されることに注意してください。
ジャストインタイムバインディングの3つのタイプの例を以下に示します-
Sr.No. | Binding Type & Description |
---|---|
1 |
非プライベート、引数なしのコンストラクターは、ジャストインタイムバインディングの対象となります。 別の方法は、コンストラクタに@Injectアノテーションを付けることです。 |
2 |
@ImplementatedByアノテーションは、実装クラスについて説明します。 このような場合、バインディングモジュールではバインディングは必要ありません。 |
3 |
@ProvidedByアノテーションは、実装クラスのプロバイダーについて説明します。 このような場合、バインディングモジュールではバインディングは必要ありません。 |
Google Guice-コンストラクターインジェクション
インジェクションは、オブジェクトに依存関係を注入するプロセスです。 コンストラクター注入は非常に一般的です。 このプロセスでは、コンストラクターへの引数として依存関係が注入されます。 下記の例をご覧ください。
例
GuiceTesterという名前のJavaクラスを作成します。
出力
次に、ファイルをコンパイルして実行します。 次の出力を見ることができます-
Google Guice-メソッドインジェクション
インジェクションは、オブジェクトに依存関係を注入するプロセスです。 メソッドインジェクションは、値オブジェクトをオブジェクトへの依存関係として設定するために使用されます。 下記の例をご覧ください。
例
GuiceTesterという名前のJavaクラスを作成します。
出力
次に、ファイルをコンパイルして実行します。 次の出力を見ることができます-
Google Guice-フィールドインジェクション
インジェクションは、オブジェクトに依存関係を注入するプロセスです。 フィールドインジェクションは、値オブジェクトをオブジェクトのフィールドへの依存関係として設定するために使用されます。 下記の例をご覧ください。
例
GuiceTesterという名前のJavaクラスを作成します。
出力
次に、ファイルをコンパイルして実行します。 次の出力を見ることができます-
Google Guice-オプションのインジェクション
インジェクションは、オブジェクトに依存関係を注入するプロセスです。 オプションの注入とは、存在する場合に依存関係を注入することです。 メソッドとフィールドの注入はオプションで依存する場合があり、依存関係が存在しない場合はデフォルト値が必要です。 下記の例をご覧ください。
例
GuiceTesterという名前のJavaクラスを作成します。
出力
次に、ファイルをコンパイルして実行します。 次の出力を見ることができます-
Google Guice-オンデマンドインジェクション
インジェクションは、オブジェクトに依存関係を注入するプロセスです。 メソッドとフィールドの注入は、* injector.injectMembers()*メソッドを使用して既存のオブジェクトを使用して初期化するために使用できます。 下記の例をご覧ください。
例
GuiceTesterという名前のJavaクラスを作成します。
出力
次に、ファイルをコンパイルして実行します。 次の出力を見ることができます-
Google Guice-スコープ
Guiceは、デフォルトの動作として値を提供するたびに新しいインスタンスを返します。 スコープを介して構成できます。 Guiceがサポートするさまざまなスコープは-
- @ Singleton -アプリケーションの存続期間の単一インスタンス。 @Singletonオブジェクトはスレッドセーフである必要があります。
- @ SessionScoped -Webアプリケーションの特定のセッションの単一インスタンス。 @SessionScopedオブジェクトはスレッドセーフである必要があります。
- @ RequestScoped -Webアプリケーションの特定のリクエストの単一インスタンス。 @RequestScopedオブジェクトはスレッドセーフである必要はありません。
スコープの適用
次の方法でスコープを適用できます-
クラスレベルで
構成レベルで
メソッドレベルで
例
動作中のクラスレベルのスコープを見てみましょう。
@Singletonアノテーションの結果
GuiceTesterという名前のJavaクラスを作成します。
ファイルをコンパイルして実行すると、同じ番号の次の出力が表示されます。
@Singletonアノテーションなしの結果
GuiceTesterという名前のJavaクラスを作成します。
出力
次に、ファイルをコンパイルして実行します。 あなたは異なる番号で次の出力を見ることができます-
Google Guice-AOP
AOP、アスペクト指向プログラミングは、プログラムロジックをいわゆる懸念と呼ばれる別個の部分に分解することを伴います。 アプリケーションの複数のポイントにまたがる機能は横断的関心事と呼ばれ、これらの横断的関心事はアプリケーションのビジネスロジックと概念的に分離されています。 ロギング、監査、宣言的トランザクション、セキュリティ、キャッシングなどの側面のさまざまな一般的な良い例があります。
OOPのモジュール性の重要な単位はクラスですが、AOPのモジュール性の単位は側面です。 依存性注入は、アプリケーションオブジェクトを相互に分離するのに役立ち、AOPは、影響を受けるオブジェクトから横断的な関心事を分離するのに役立ちます。 AOPは、Perl、.NET、Javaなどのプログラミング言語のトリガーのようなものです。 Guiceは、アプリケーションをインターセプトするインターセプターを提供します。 たとえば、メソッドの実行時に、メソッドの実行前または実行後に機能を追加できます。
重要なクラス
- Matcher -Matcherは、値を受け入れるか拒否するかのインターフェイスです。 Guice AOPでは、2つのマッチャーが必要です。1つは参加するクラスを定義するものであり、もう1つはそれらのクラスのメソッド用です。
- MethodInterceptor -MethodInterceptorsは、一致するメソッドが呼び出されたときに実行されます。 メソッド、引数、受信インスタンスなどの呼び出しを検査できます。 クロスカットロジックを実行してから、基になるメソッドに委任できます。 最後に、戻り値または例外を調べて戻ります。
例
GuiceTesterという名前のJavaクラスを作成します。
出力
ファイルをコンパイルして実行すると、次の出力が表示される場合があります。