Guiceとは
GoogleからリリースされているDIコンテナ
XMLレスでDIの定義をコード内での記述で閉じられる
現在2.0がリリースされている
http://code.google.com/p/google-guice/
最初の一歩
Client が DIされた Service を実行する単純なケースの実装
まず Service のインターフェース
public interface Service { String execute(); }
Service のImpl
public class ServiceImpl implements Service { @Override public String execute() { return "Execute!!"; } }
Client の実装はコンストラクタインジェクションにてServiceを設定するようにする
このときコンストラクタに@Injectアノテーションを付与
public class Client { private final Service service; @Inject public Client(Service service) { this.service = service; } public String exec() { return service.execute(); } }
Linked Bindings にて DI を定義する Module を作成
public class Module extends AbstractModule { @Override protected void configure() { bind(Service.class).to(ServiceImpl.class).in(Scopes.SINGLETON); } }
テスト実行
public class ClientTest { private static Client client; @BeforeClass public static void setUpBeforeClass() throws Exception { Injector injector = Guice.createInjector(new Module()); client = injector.getInstance(Client.class); } @Test public final void testExec() { assertEquals("Execute!!", client.exec()); } }
グリーンバーとなれば成功
Moduleを無名クラスとして扱う
Moduleクラスを作成しなくても、以下のように無名クラスとして扱うのもあり
public class ClientTest { private static Client client; @BeforeClass public static void setUpBeforeClass() throws Exception { Injector injector = Guice.createInjector( new AbstractModule() { @Override protected void configure() { bind(Service.class).to(ServiceImpl.class).in(Scopes.SINGLETON); } }); client = injector.getInstance(Client.class); } @Test public final void testExec() { assertEquals("Execute!!", client.exec()); } }