Quiero utilizar google guice para hacer que las propiedades estén disponibles en todas las clases de mi aplicación. Definí un Módulo que carga y vincula el archivo de propiedades Test.properties.Uso de Google Guice para inyectar propiedades de Java
Property1=TEST
Property2=25
package com.test;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Properties;
import com.google.inject.AbstractModule;
import com.google.inject.name.Names;
public class TestConfiguration extends AbstractModule {
@Override
protected void configure() {
Properties properties = new Properties();
try {
properties.load(new FileReader("Test.properties"));
Names.bindProperties(binder(), properties);
} catch (FileNotFoundException e) {
System.out.println("The configuration file Test.properties can not be found");
} catch (IOException e) {
System.out.println("I/O Exception during loading configuration");
}
}
}
Estoy usando una clase principal donde creo un inyector para inyectar las propiedades.
package com.test;
import com.google.inject.Guice;
import com.google.inject.Injector;
public class Test {
public static void main(String[] args) {
TestConfiguration config = new TestConfiguration();
Injector injector = Guice.createInjector(config);
TestImpl test = injector.getInstance(TestImpl.class);
}
}
package com.test;
import com.google.inject.Inject;
import com.google.inject.name.Named;
public class TestImpl {
private final String property1;
private final Integer property2;
@Inject
public TestImpl(@Named("Property1") String property1, @Named("Property2") Integer property2) {
System.out.println("Hello World");
this.property1 = property1;
this.property2 = property2;
System.out.println(property1);
System.out.println(property2);
}
}
Ahora mi pregunta. Si mi TestImpl crea otras clases donde también necesito inyectar propiedades, y esas clases también necesitan inyectar propiedades, ¿cuál es la forma correcta de hacerlo?
Pase el inyector para todas las subclases y luego usar injector.getInstance (...) para crear las subclases?
instanciar un nuevo inyector como
TestConfiguration config = new TestConfiguration(); Injector injector = Guice.createInjector(config); TestImpl test = injector.getInstance(TestImpl.class);
en todas las clases anidadas?
- ¿Existe algún otro enfoque para que las propiedades estén disponibles en todas las clases?
hay una razón por la que es nuevo 'ellos manualmente en lugar de usar guice para inyectarlos en tu clase de prueba (¿cuál sería la forma normal)? – Matt
¿Quiere decir por qué "TestConfiguration config = new TestConfiguration();"? ¿Puedes dar un ejemplo de cómo hacerlo de otra manera? – markus
@markus: No, no 'TestConfiguration' ... es normal que los' nuevos' módulos. La pregunta es acerca de 'TestImpl' creando otras clases donde también necesita inyectar propiedades. Normalmente, declararías esas otras clases (o 'Provider's de ellas) como dependencias de' TestImpl' para que Guice pueda crearlas en lugar de que las crees con 'new' en' TestImpl'. – ColinD