これを行うには2つの方法があります。
オプションの注入
com.google.inject.Injectアノテーションを使用します。これにより、アノテーションにオプションを指定することができます。次の例を参照してください。
注釈は、Aがオプションであることを示します。それは注入されません。スニペットの印刷を実行します。
Object is: null
方法2(これはguice 4+の後で行います)。オプションのバインディングを指定できます。これらのバインディングでは、必要に応じてデフォルト値を定義することもできます。
public class GuiceInjectOptional extends AbstractModule {
@Override
protected void configure() {
// set up optional binding for A.
OptionalBinder.newOptionalBinder(binder(), A.class);
bind(B.class).in(Singleton.class);
}
public static class A {
private String name;
// non null constructor so that A can't be instantiated automatically by guice
public A(String name) {
this.name = name;
}
@Override
public String toString() {
return "I am: " + name;
}
}
public static class B {
@Inject
Optional<A> obj;
void run() {
System.out.println("Object is present: " + obj.isPresent());
System.out.println("Object is: " + obj);
}
}
public static void main(String[] args) {
Injector injector = Guice.createInjector(new GuiceInjectOptional());
injector.getInstance(B.class).run();;
}
}
を注入アノテーションは今や非オプションですが、GuiceのがクラスAがかないかもしれないバインドされた可能性があることを認識している:あなたは、私が書いたこのスニペットのように任意の値を注入することができます。 は、スニペットを実行すると、印刷されます:
Object is present: false
Object is: Optional.empty
を最後に、その後、普通に結合することができ、Guiceには、それを注入します:
public class GuiceInjectOptional extends AbstractModule {
@Override
protected void configure() {
// set up optional binding for A.
OptionalBinder.newOptionalBinder(binder(), A.class);
bind(A.class).toInstance(new A("Pandaa!"));
bind(B.class).in(Singleton.class);
}
public static class A {
private String name;
// non null constructor so that A can't be instantiated automatically by guice
public A(String name) {
this.name = name;
}
@Override
public String toString() {
return "I am: " + name;
}
}
public static class B {
@Inject
Optional<A> obj;
void run() {
System.out.println("Object is present: " + obj.isPresent());
System.out.println("Object is: " + obj);
}
}
public static void main(String[] args) {
Injector injector = Guice.createInjector(new GuiceInjectOptional());
injector.getInstance(B.class).run();;
}
}
そして、上記の意志の印刷:
Object is present: true
Object is: Optional[I am: Pandaa!]
そして、これはあなたがguiceとのフェイルセーフオプションバインディングを持っている方法です:私はこれが助けてくれることを願っています。
編集:私はguice-3タグを見たので、オプションのバインダーではなくオプションの注釈メソッドを使用したいと思うでしょう。オプションの注釈では、オプション値ではなくヌルのままです。
アルテール
ありがとうございました。私は実際にguice 4を使用しています。オプションの問題は、子モジュールのインジェクタにOptional を使い、親モジュールがOptionalBinderを使用しなかった場合、OptionalBinderを親モジュールに設定し、親モジュールへのアクセス権がないことです。 Guiceは拘束力がないと不平を言う。しかし、私はあなたが最初のソリューションについて知りませんでした。なぜなら、私は、Injectorを使用していたからです。そのソリューションは私のために働いた、ありがとう! –
あなたはあなたの子モジュールで自分自身のバインディングを使用することができ、常にそれを持っているはずです。親モジュールがバインディングを追加する場合、オプションは何もしません。そうでなければ、あなたの親にバインドされているものを使用します。 – pandaadb