Guice 最初の一歩

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());
    }
}