2011-01-26 82 views
18

對於用Java編寫的監控軟件,我考慮使用Google Guice作爲DI提供程序。該項目需要從外部資源(文件或數據庫)加載其配置。該應用程序被設計爲在獨立模式或servlet容器中運行。Guice和一般應用程序配置

當前配置不包含用於依賴項注入的綁定或參數,只有一些全局應用程序設置(JDBC連接定義和關聯的數據庫管理/監視對象)。

我看到兩個選項:

  • 到使用Guice的基於文件的插件,如guice-xml-config來存儲應用程序選項(這將允許稍後配置DI部分,如果它變得需要薩利)。

你會推薦對兩種任務使用Guice,還是將一般應用程序配置與依賴注入分開?你認爲哪些優點和缺點是最重要的?

回答

29

這是直截了當地啜一吉斯模塊中的屬性文件:

public class MyModule extends AbstractModule { 

    @Override 
    protected void configure() { 
    try { 
     Properties properties = new Properties(); 
     properties.load(new FileReader("my.properties")); 
     Names.bindProperties(binder(), properties); 
    } catch (IOException ex) { 
     //... 
    } 
    } 
} 

後來它很容易從屬性到其他配置源切換。

[編輯]

順便說一句,你可以通過@Named("myKey")標註它獲得注入的屬性。

+1

+1我想你也應該提儘管如何使用`@ Named`注入屬性。 – ColinD 2011-01-26 15:32:13

1

我在自己的項目中遇到了同樣的問題。我們已經選擇了Guice作爲DI框架,並且爲了簡單起見,還想在配置中使用它。

我們最終從屬性文件中使用Apache Commons Configuration讀取配置,並將它們綁定到Guice注入器,如Guice FAQ How do I inject configuration parameters?中的建議。

@Override public void configure() { 
    bindConstant().annotatedWith(ConfigurationAnnotation.class) 
     .to(configuration.getString("configurationValue"));  
} 

重新加載Commons Configuration支持的配置也很容易實現Guice注入。

@Override public void configure() { 
    bind(String.class).annotatedWith(ConfigurationAnnotation.class) 
     .toProvider(new Provider<String>() { 
      public String get() { 
       return configuration.getString("configurationValue"); 
      } 
    });  
} 
3

嘗試Guice configuration Maven的中央可用,它的支持屬性,HOCON和JSON格式。

您可以從注入文件application.conf性能對您的服務爲:

@BindConfig(value = "application") 
public class Service { 

    @InjectConfig 
    private int port; 

    @InjectConfig 
    private String url; 

    @InjectConfig 
    private Optional<Integer> timeout; 

    @InjectConfig("services") 
    private ServiceConfiguration services; 
} 

,您必須安裝模塊ConfigurationModule作爲

public class GuiceModule extends AbstractModule { 
    @Override 
    protected void configure() { 
     install(ConfigurationModule.create()); 
     requestInjection(Service.class); 
    } 
}