2011-01-26 17 views
18

Para un software de supervisión escrito en Java, considero usar Google Guice como proveedor de DI. El proyecto debe cargar su configuración desde un recurso externo (archivo o base de datos). La aplicación está diseñada para ejecutarse en modo independiente o en un contenedor de servlets.Guice y configuración de aplicación general

En el momento de la configuración no contiene fijaciones o parámetros para la inyección de dependencias, sólo algunos ajustes globales de aplicaciones (las definiciones de conexión JDBC y objetos de base de datos de gestión/control correspondientes).

veo dos opciones:

  • Para utilizar otra biblioteca, por ejemplo Apache Commons Configuration, que es compatible con las fuentes de archivos y configuración JDBC (y muchos otros)

o

  • a utilice un complemento basado en archivos para Guice como guice-xml-config para almacenar las opciones de la aplicación (esto permitiría configurar la parte DI más adelante si se vuelve necesario) sary).

¿Recomendaría utilizar Guice para ambas tareas, o mantener la configuración de la aplicación general separada de la inyección de dependencia? ¿Qué ventajas y desventajas considerarías las más importantes?

Respuesta

29

Es fácil de sorber un archivo de propiedades de un módulo de 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) { 
     //... 
    } 
    } 
} 

tarde que es fácil cambiar de propiedades a otras fuentes de configuración.

[Editar]

Por cierto, usted puede conseguir las propiedades inyectados anotando con @Named("myKey").

+1

+1 Creo que también se debe mencionar cómo se inyectan las propiedades usando '@ Named' embargo. – ColinD

1

me encontré con el mismo problema en mi propio proyecto. Ya habíamos elegido Guice como DI-framework y para mantener las cosas simples queríamos usarlo también con la configuración.

Terminamos leyendo la configuración del archivo de propiedades usando Apache Commons Configuration y vinculándolas al inyector Guice como se sugiere en las Preguntas frecuentes de Guice How do I inject configuration parameters?.

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

Recarga de configuración compatible por la configuración Commons también es bastante fácil de implementar en la inyección Guice.

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

Comprobar la biblioteca Governator:

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

Usted obtendrá una anotación de @Configuration y varios proveedores de configuración.En el código que ayuda a ver dónde es a ti parámetros de configuración utilizados:

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

También, Usted recibirá un informe de configuración agradable en el inicio:

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

3

Trate Guice configuration disponibles en experta en el centro, es el apoyo Propiedades, formato HOCON y JSON.

Puede inyectarse inmuebles de archivo application.conf a su servicio como:

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

    @InjectConfig 
    private int port; 

    @InjectConfig 
    private String url; 

    @InjectConfig 
    private Optional<Integer> timeout; 

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

Debe instalar los módulos ConfigurationModule como

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