有2種方式來做到這一點。
可選注入
使用com.google.inject.Inject註解。這一個允許你在註釋中指定可選項。看到這個例子:
public class GuiceInjectOptional extends AbstractModule {
@Override
protected void configure() {
// method 1:
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=true)
A obj;
void run() {
System.out.println("Object is: " + obj);
}
}
public static void main(String[] args) {
Injector injector = Guice.createInjector(new GuiceInjectOptional());
injector.getInstance(B.class).run();;
}
}
B類的註釋表明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();;
}
}
在注入註解是現在非可選,但吉斯知道,A類可能會或可能不會被束縛。 運行代碼將打印:
Object is present: false
Object is: Optional.empty
最後,那麼你可以綁定一個正常和吉斯將其注入:
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可選綁定:)我希望這可以幫助。
編輯:我剛纔看到的吉斯-3標籤,所以你要使用可選的標註方法,而不是可選的粘合劑。使用可選註釋時,它將保持爲空而不是可選值。
Artur
感謝您的詳細解釋。實際上,我使用吉斯4,具有可選的問題是,OptionalBinder必須在父模塊進行設置和我沒有訪問父模塊,如果我只是在孩子注射使用可選和家長模塊沒有使用OptionalBinder ,Guice抱怨綁定不存在。但是我不知道你的第一個解決方案,因爲我使用的是javax Injector。該解決方案爲我工作,謝謝! –
你應該能夠你的孩子模塊中使用在任意的結合你自己,只是總是有它存在。如果父模塊增加了一個綁定,您可選擇不執行任何操作,否則會使用什麼是你父母的約束。 – pandaadb