Provides オブジェクトを提供するメソッド
注入するObjectの作成が簡単ではない場合、Injectionだけで全部Objectを作ろうとするとちょっと大変です。
こういう場合に使える@Providesメソッドの使い方です。
Moduleクラスはオブジェクトの作り方を示すわけですが、configure()内でbindする以外に、注入するオブジェクトをMethodで作って渡す事が出来ます。
import com.google.inject.AbstractModule;
import com.google.inject.Provides;
public class ConfigurationModule extends AbstractModule {
@Override
protected void configure() {
}
@Provides
private Service provideService() {
System.out.println("Provider called.");
return new ServiceImpl();
}
}
見れば分かると思いますが、この場合bindは必要ありません。bindするとエラーになります。
InjectorはServiceの実装を供給するためにはMethodを呼び出せば良い事だけ知っていれば事たりるからです。
二点ほど注意ですが、Scopeの設定やSingletonの実装をする責任はProvides Method側にあります。
ServiceImplのclass定義に@Singletonアノテーションを追加してもSingletonにはなりません。
代わりに@Provides Method側に@Singletonを追加する事でSingletonになります。
import com.google.inject.AbstractModule;
import com.google.inject.Provides;
public class ConfigurationModule extends AbstractModule {
@Override
protected void configure() {
}
@Singleton @Provides
private Service provideService() {
System.out.println("Provider called.");
return new ServiceImpl();
}
}
もう一点は Provider内から例外を投げるのは許可されていないとのこと。この場合 @CheckedProvidesを使うべきとのこと。これについては別の機会に書こうかなと。
他にも Annotated Bindingsとか Constructor Bindingsとかありますが、個人的にあまり使用しない(Constructor BindingsはAOPを利用しない場合、普通にProvides Methodで十分対処可能)ここら辺はとりあえず一旦放置