2011-01-26 23 views
18

W przypadku oprogramowania monitorującego napisanego w Javie, uważam użycie Guice Google jako dostawcy DI. Projekt musi załadować swoją konfigurację z zewnętrznego zasobu (pliku lub bazy danych). Aplikacja jest przeznaczona do pracy w trybie autonomicznym lub w kontenerze serwletów.Guice i ogólna konfiguracja aplikacji

W tej chwili konfiguracja nie zawiera powiązań ani parametrów dla wtrysku zależności, tylko niektóre globalne ustawienia aplikacji (definicje połączeń JDBC i powiązane obiekty zarządzania/monitorowania bazy danych).

widzę dwie opcje:

  • użyć innej biblioteki, na przykład Apache Commons Configuration, który obsługuje plików i konfiguracji JDBC źródła (i wiele innych)

lub

  • do użyj rozszerzenia opartego na pliku dla Guice, takiego jak guice-xml-config, aby zapisać opcje aplikacji (pozwoli to skonfigurować część DI później, jeśli będzie to konieczne sary).

Czy poleciłbyś używać Guice do obu zadań, czy też konfigurację ogólnej aplikacji pozostawić oddzielnie od iniekcji zależności? Jakie zalety i wady uznaliby Państwo za najważniejsze?

Odpowiedz

29

To proste slurp pliku właściwości w module Guice:

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) { 
     //... 
    } 
    } 
} 

Później można łatwo przełączać się z właściwości do innych źródeł konfiguracyjnych.

[Edytuj]

BTW, można uzyskać wstrzyknięte właściwości przez opisywanie go @Named("myKey").

+1

+1 myślę, że należy również wspomnieć jak właściwości są wstrzykiwane za pomocą '@ Named'. – ColinD

1

Wpadłem na ten sam problem w moim własnym projekcie. Już wcześniej wybraliśmy Guice jako framework DI-owy i chcemy, aby rzeczy były proste, aby można było z niego korzystać także w konfiguracji.

Skończyło się na tym, że odczytaliśmy konfigurację z pliku właściwości za pomocą Apache Commons Configuration i powiązaliśmy je z wtryskiwaczem Guice, jak sugerowano w Guice FAQ How do I inject configuration parameters?.

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

Ponowne ładowanie konfiguracji obsługiwane przez Commons Configuration jest również dość łatwe w implementacji wtrysku Guice.

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

Sprawdź biblioteka Governator:

https://github.com/Netflix/governator/wiki/Configuration-Mapping

Dostaniesz adnotacji @Configuration i kilku dostawców konfiguracyjnych.W kodzie pomaga zobaczyć, gdzie to ty parametry konfiguracyjne używane:

@Configuration("configs.qty.things") 
private int numberOfThings = 10; 

Również Dostaniesz piękny raport konfiguracji na starcie:

https://github.com/Netflix/governator/wiki/Configuration-Mapping#configuration-documentation

3

Spróbuj Guice configuration dostępne na Maven centralny, to wsparcie Właściwości, format HOCON i JSON.

można wstrzyknąć właściwości z pliku application.conf do usługi jak:

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

    @InjectConfig 
    private int port; 

    @InjectConfig 
    private String url; 

    @InjectConfig 
    private Optional<Integer> timeout; 

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

Musisz zainstalować moduły ConfigurationModule jak

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