2011-01-26 7 views
18

Per un software di monitoraggio scritto in Java, considero l'uso di Google Guice come provider DI. Il progetto deve caricare la sua configurazione da una risorsa esterna (file o database). L'applicazione è progettata per l'esecuzione in modalità standalone o in un contenitore servlet.Guice e configurazione generale dell'applicazione

Al momento la configurazione non contiene binding o parametri per l'integrazione delle dipendenze, solo alcune impostazioni dell'applicazione globali (definizioni di connessione JDBC e oggetti di gestione/monitoraggio del database associati).

vedo due opzioni:

  • Per utilizzare un'altra libreria, per esempio Apache Commons Configuration, che supporta le fonti dei file di configurazione e JDBC (e molti altri)

o

  • a utilizzare un addon basato su file per Guice come guice-xml-config per memorizzare le opzioni dell'applicazione (ciò consentirebbe di configurare la parte DI più tardi se diventa neces Sary).

Si consiglia di utilizzare Guice per entrambe le attività o mantenere la configurazione dell'applicazione generale separata dall'iniezione delle dipendenze? Quali vantaggi e svantaggi considereresti i più importanti?

risposta

29

E 'semplice per trangugiare un file di proprietà in un modulo 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) { 
     //... 
    } 
    } 
} 

Più tardi è facile passare da proprietà ad altre fonti di configurazione.

[Edit]

BTW, è possibile ottenere le proprietà iniettati annotando con @Named("myKey").

+1

+1 penso che si dovrebbe anche ricordare come vengono iniettate le proprietà usando '@ Named'. – ColinD

1

Mi sono imbattuto nello stesso problema nel mio progetto. Avevamo già scelto Guice come DI-framework e per mantenere le cose semplici volevamo usarlo anche con la configurazione.

Abbiamo finito per leggere la configurazione dal file delle proprietà utilizzando Apache Commons Configuration e vincolandole all'iniettore Guice come suggerito nelle FAQ di Guice How do I inject configuration parameters?.

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

Ricaricamento della configurazione supportato da Commons La configurazione è anche abbastanza facile da implementare nell'iniezione di Guice.

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

Controllare la libreria Governator:

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

Otterrete un'annotazione @Configuration e diversi fornitori di configurazione.Nel codice aiuta a vedere dove siete voi i parametri di configurazione utilizzati:

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

Inoltre, Si otterrà un rapporto di configurazione bel all'avvio:

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

3

Prova Guice configuration accessibile centrale Maven, è il supporto Proprietà, formato HOCON e JSON.

È possibile iniettare oggetti di file di application.conf al vostro servizio come:

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

    @InjectConfig 
    private int port; 

    @InjectConfig 
    private String url; 

    @InjectConfig 
    private Optional<Integer> timeout; 

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

È necessario installare i moduli ConfigurationModule come

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