Google guice 2.0 の時に、Provider の定義で T get() で例外が発生するケースのために、
com.google.inject.throwingproviders.ThrowingProvider が存在した。
Google guice 3.0 では、この ThrowingProvider が、@deprecated になり使用が
奨励されなくなった。
代わりに com.google.inject.throwingproviders.CheckedProvider を継承したインターフェースを
Modulle バインド定義に使う方法が提示された。
例えば、すべての例外に対応して CheckedProvider を継承して以下のように、
用意する。
import com.google.inject.throwingproviders.CheckedProvider;
public interface GeneralProVider<T> extends CheckedProvider<T>{
@Override
public T get() throws Exception;
}
-----------------------------------------------------
インジェクタ、バインド定義は、、
Injector injector = Guice.createInjector(new AbstractModule(){
@Override
protected void configure(){
ThrowingProviderBinder.create(binder())
.bind(GeneralProVider.class , Foo.class)
.to(FooProvider.class);
}
});
Sample s = injector.getInstance(Sample.class);
s.exec();
-----------------------------------------------------
import java.util.Properties;
public class FooProvider implements GeneralProVider<Foo>{
@Override
public Foo get() throws Exception{
Properties prop = new Properties();
prop.load(ClassLoader.getSystemResourceAsStream("foo.properties"));
return new FooImpl(prop);
}
}
-----------------------------------------------------
public interface Foo{
public String getValue(String key);
}
-----------------------------------------------------
import java.util.Properties;
public class FooImpl implements Foo{
private Properties prop;
protected FooImpl(Properties prop){
this.prop = prop;
}
@Override
public String getValue(String key){
return this.prop.getProperty(key);
}
}
-----------------------------------------------------
class Sample{
@Inject FooProvider provider;
public void exec(){
try{
Foo foo = this.provider.get();
String v = foo.getValue("Foo");
System.out.println("v = "+v);
}catch(Exception e){
e.printStackTrace();
}
}
}