2016-08-01 55 views

回答

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對類(實際實例)非常有用,對於屬性而言非常有用。原因如下:

  1. 您必須提前知道所有屬性並將它們綁定到默認值。很容易忘記它們。 OP顯示的例子還表明,他不知道他是否擁有可用的財產(基於名稱)。

  2. 屬性綁定的默認實現不能與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); 

     } 

我不得不復制命名綁定代碼,並改變它支持可選的綁定。

總結:

  1. 我寧願使用可選= true標誌+默認值在代碼性能。

  2. 對可選的實際類使用OptionalBinding。

最後,還有一件事你可以做 - 這是我在我的代碼中的解決方案。我有一個類似的要求(不是可選的,但默認值)。

我想:

  1. 綁定我的財產
  2. 檢查我的屬性是一個變量
  3. 替換變量
  4. 如果變量不可設置默認

Apache爲我提供了一個方便的庫,可以重複使用。這是我的屬性如何:

myProperty=${ENV_VAR_NAME:-600} 

這是如何定義默認值的默認註釋。 上述屬性說:

  1. 使用evnironment變量「ENV_VAR_NAME」。
  2. 如果沒有設置 「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); 

這段代碼的含義是:

  1. 負載來自資源文件的屬性
  2. 使用EnvironmentVariableSubstitutor來處理屬性的值並覆蓋結果。 (請參閱循環)
  3. 最後,將修改的屬性綁定到它們的名稱。

這些所有的解決方案,我可以在短時間內拿出:)讓我知道如果有什麼地方不清楚

編輯2:

上有OptionalBindings和屬性+一些信息如何處理在此谷歌線程默認值,以及:https://groups.google.com/forum/#!topic/google-guice/7Ga79iU_sb0

阿圖爾

+0

隨着吉斯4+,你應該使用'OptionalBinder'而不是'@注入(可選=真)' –

+0

@TavianBarnes謝謝!我不知道,稍後會更新我的例子。 – pandaadb

+0

@TavianBarnes我認爲OptionalBinding對於你不知道它們是否存在的屬性並不是很有用。我用我的想法更新了答案:)無論如何,很高興知道它 – pandaadb