0
A
回答
0
在Guice中,您將註釋該方法並使其成爲可選項。然後您只需分配默認值。如果沒有要注入的屬性,它將是默認值。
例如:
public class TestModule3 extends AbstractModule {
@Override
protected void configure() {
// Properties p = new Properties();
// p.setProperty("myValue", "12");
// Names.bindProperties(binder(), p); // this binds the properties that usually come for a file
bind(Manager.class).to(ManagerImpl.class).in(Singleton.class);
}
public static interface Manager {
public void talk();
}
public static class ManagerImpl implements Manager {
@Inject(optional = true)
@Named("myValue")
int test = 0;
@Override
public void talk() {
System.out.println(test);
}
}
public static void main(String[] args) {
Manager instance = Guice.createInjector(new TestModule3()).getInstance(Manager.class);
instance.talk();
}
}
這將打印 「0」 爲你,因爲我註釋掉的屬性綁定。如果刪除註釋,它將把值12綁定到String myValue。注射註解照顧其餘部分。
希望幫助,
編輯:
由於@TavianBarnes指出,吉斯4+有OptionalBinder。我試過這個用於你的用例,並且無法使它開箱即用。
看來OptionalBinding對類(實際實例)非常有用,對於屬性而言非常有用。原因如下:
您必須提前知道所有屬性並將它們綁定到默認值。很容易忘記它們。 OP顯示的例子還表明,他不知道他是否擁有可用的財產(基於名稱)。
屬性綁定的默認實現不能與OptionalBinding組合使用。
所以,你可以作出這樣的工作方式是這樣的:
OptionalBinder.newOptionalBinder(binder(), Key.get(String.class, Names.named("myValue"))).setDefault()
.toInstance("777");
Properties p = new Properties();
p.setProperty("myValue", "12");
// use enumeration to include the default properties
for (Enumeration<?> e = p.propertyNames(); e.hasMoreElements();) {
String propertyName = (String) e.nextElement();
String value = p.getProperty(propertyName);
OptionalBinder.newOptionalBinder(binder(), Key.get(String.class, Names.named(propertyName))).setBinding()
.toInstance(value);
}
我不得不復制命名綁定代碼,並改變它支持可選的綁定。
總結:
我寧願使用可選= true標誌+默認值在代碼性能。
對可選的實際類使用OptionalBinding。
最後,還有一件事你可以做 - 這是我在我的代碼中的解決方案。我有一個類似的要求(不是可選的,但默認值)。
我想:
- 綁定我的財產
- 檢查我的屬性是一個變量
- 替換變量
- 如果變量不可設置默認
Apache爲我提供了一個方便的庫,可以重複使用。這是我的屬性如何:
myProperty=${ENV_VAR_NAME:-600}
這是如何定義默認值的默認註釋。 上述屬性說:
- 使用evnironment變量「ENV_VAR_NAME」。
- 如果沒有設置 「ENV_VAR_NAME」,用 「600」
然後我將它綁定值,如下所示:
InputStream resourceAsStream = getClass().getResourceAsStream(path);
if(resourceAsStream == null) {
throw new IllegalArgumentException("No property file found for path: " + path);
}
try {
p.load(resourceAsStream);
EnvironmentVariableSubstitutor envSubstitutor = new EnvironmentVariableSubstitutor(false);
Set<Object> keys = p.keySet();
for(Object k : keys) {
String property = p.getProperty(k.toString());
property = envSubstitutor.replace(property);
p.put(k, property);
}
} catch (IOException e) {
throw new IllegalStateException("Could not load properties", e);
} finally {
try {
resourceAsStream.close();
} catch (IOException e) {
log.error("Could not close stream for resource " + path);
}
}
Names.bindProperties(binder(), p);
這段代碼的含義是:
- 負載來自資源文件的屬性
- 使用EnvironmentVariableSubstitutor來處理屬性的值並覆蓋結果。 (請參閱循環)
- 最後,將修改的屬性綁定到它們的名稱。
這些所有的解決方案,我可以在短時間內拿出:)讓我知道如果有什麼地方不清楚
編輯2:
上有OptionalBindings和屬性+一些信息如何處理在此谷歌線程默認值,以及:https://groups.google.com/forum/#!topic/google-guice/7Ga79iU_sb0
阿圖爾
相關問題
- 1. 如何設置一個默認值MvxSpinner
- 2. 分配默認值變量,如果一個未設置,猛砸
- 3. JavaScript:將變量設置爲默認值?
- 4. UIView - 設置成員變量默認值
- 5. Sass:將默認值設置爲變量
- 6. 如何設置默認值
- 7. 如何設置默認值?
- 8. Bash:如何從參數中設置一個變量,並使用默認值
- 9. Android的:如何設置默認值的參數變量
- 10. 如何將變量設置爲默認值?
- 11. 如何在rails中設置select_tag的默認值?實例變量
- 12. 如何在模板中設置變量默認值?
- 13. 如何在C#中設置變量的默認值?
- 14. 如何設置實例變量的默認值?
- 15. 如何根據變量設置下拉列表默認值?
- 16. 如何在參數列表中設置變量的默認值
- 17. 如何設置枚舉類型變量的默認值?
- 18. 如何爲使用list()設置的變量提供默認值?
- 19. 一個變量的默認值
- 20. 我如何設置默認的變量爲每個會話
- 21. 定義一個變量,並將其設置爲默認值,如果定義
- 22. 如何分配一個默認的「回退」提供商的谷歌吉斯
- 23. 設置默認值
- 24. 設置默認值
- 25. 設置默認值
- 26. 設置默認值
- 27. 設置默認值
- 28. 設置默認值
- 29. 設置默認值
- 30. 設置默認值
隨着吉斯4+,你應該使用'OptionalBinder'而不是'@注入(可選=真)' –
@TavianBarnes謝謝!我不知道,稍後會更新我的例子。 – pandaadb
@TavianBarnes我認爲OptionalBinding對於你不知道它們是否存在的屬性並不是很有用。我用我的想法更新了答案:)無論如何,很高興知道它 – pandaadb