Google Guice(その2) 最も単純にInjectするサンプル

一番単純なサンプルを、ユーザガイドから少し変えて書いてみます。あ、このドキュメントGoogle Docsだ。
構成は以下。

Service
Injectするインタフェース
ServiceImpl
Injectするインタフェースの実装クラス
Client
ServiceがInjectされるクラス
Main
起動クラス

まずServiceとServiceImpl。

public interface Service {
	String getResponse(String msg);
}
public class ServiceImpl implements Service {
	public String getResponse(String msg) {
		return "Re: " + msg;
	}
}

当たり前ですが、POJOです。そしてServiceを呼び出すClient。

import com.google.inject.Inject;

public class Client {
	@Inject
	private Service service;
	
	public void execute() {
		String response = service.getResponse("Hello");
		System.out.println(response);
	}
}

もう、どう見てもserviceをInjectする気満々ですね。「どこにInjectするか」は、アノテーション@Injectで指定するようです。
さて一番知りたいのは、何をするとこれがInjectされるのか。

public class Main {
	public static void main(String[] args) {
		Injector injector = Guice.createInjector(new MyModule());
		Client client = injector.getInstance(Client.class);
		client.execute();
	}
	
	static public class MyModule extends AbstractModule {
		@Override
		protected void configure() {
			bind(Service.class).to(ServiceImpl.class);
		}
	}
}

これだけでした。気になっていた部分は、

bind(Service.class).to(ServiceImpl.class);

で、今回の例では、bind(インタフェース).to(実装クラス) で「何をInjectするか」を設定しています。SpringだとXML定義を書くところですね。Injectorを作ってgetInstance()しているのは、SpringでApplicationContextを作ってgetBean()しているのと同じ感じですね。

という事で、実行するとめでたく

Re: Hello

と表示されました。