Guiceを使ってみる。
Guiceを使ってみます。
単純なサンプル
DIコンテナからサービスのインスタンスを取得するだけの単純なサンプルです。インジェクションなし。
- Injector
- DIコンテナに該当。サービスの実装はここから取得します。
- Module
- DICONファイルに該当。サービスと実装の関連づけをJavaのコードで記述します。また、Guiceではアノテーションを利用して設定を行う方法もサポートされています。
public static void main( String[] args ) throws Exception { // インジェクターを作る。 // 引数で渡すModuleでサービスと実装の関連づけを指定する。 Injector injector = Guice.createInjector( new Module() { public void configure ( Binder b ) { // Kittenの実装として、KittenImplを関連づける。 b.bind( Kitten.class ).to( KittenImpl.class ); } }); // インジェクターからKittenの実装を取得 Kitten s = injector.getInstance(Kitten.class); s.meow(); } /** * サービスのインターフェイス */ static interface Kitten { void meow (); } /** * サービスの実装 */ static class KittenImpl implements Kitten { public void meow () { System.out.println( "meow!" ); } }
出力:
meow!
インジェクション
インジェクションするには、インジェクション先にアノテーションを付加します。
public static void main( String[] args ) throws Exception { Injector injector = Guice.createInjector( new Module() { public void configure ( Binder b ) { b.bind( Kitten.class ).to( KittenImpl.class ); b.bind( Cat.class ).to( CatImpl.class ); } }); // インジェクターからCatの実装を取得して実行 Cat cat = injector.getInstance(Cat.class); cat.meow(); } /** * 注入先のインターフェイス */ static interface Cat { void meow (); } /** * 注入先の実装 */ static class CatImpl implements Cat { private Kitten kitten; @Inject // インジェクション先にアノテーションを追加。 void setKitten( Kitten kitten ) { this.kitten = kitten; } public void meow () { this.kitten.meow(); } } /** * サービスのインターフェイス */ static interface Kitten { void meow (); } /** * サービスの実装 */ static class KittenImpl implements Kitten { public void meow () { System.out.println( "meow!" ); } }
出力:
meow!
参考: Java on Guice Guice 1.0 User's Guide
Kazuhiro's Weblog-「Guice」 −Google発のJava用DIコンテナ− を使ってみる