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で十分対処可能)ここら辺はとりあえず一旦放置