Android+Guice その6

※2012・10 こちらのページにまとめるようにしてみました。

注入する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で十分対処可能)ここら辺はとりあえず放置して、
次回からはAndroidのアプリケーションでの使用をテストしてみたいと思います。

Leave a Reply

Your email address will not be published. Required fields are marked *