binding - provides - how to use guice
¿Cómo enlazar cadena a variable en Guice? (3)
Soy nuevo en Guice y aquí hay una pregunta ingenua. Aprendí que podríamos vincular String a un valor particular a través de:
bind(String.class)
.annotatedWith(Names.named("JDBC URL"))
.toInstance("jdbc:mysql://localhost/pizza");
Pero, ¿y si quiero unir String a cualquier posible personaje?
O creo que podría ser descrito de esta manera:
¿Cómo puedo reemplazar "nuevo SomeClass (String strParameter)" con Guice?
Encuentro una solución en la FAQ de Guice:
http://code.google.com/docreader/#p=google-guice&s=google-guice&t=FrequentlyAskedQuestions
Además de definir una anotación y un atributo de cadena en MyModule, necesito escribir debajo de la línea para obtener una instancia de SomeClass:
SomeClass instance = Guice.createInjector(new MyModule("any string i like to use")).getInstance(SomeClass.class);
Pero recordé que Injector.getInstance () no debería usarse a excepción del objeto raíz, así que, ¿hay alguna forma mejor de hacerlo?
Esto puede ser fuera de tema, pero Guice hace que la configuración sea mucho más fácil que escribir un enlace explícito para cada String que necesita. Solo puedes tener un archivo de configuración para ellos:
Properties configProps = Properties.load(getClass().getClassLoader().getResourceAsStream("myconfig.properties");
Names.bindProperties(binder(), configProps);
y voilà toda su configuración está lista para inyección:
@Provides // use this to have nice creation methods in modules
public Connection getDBConnection(@Named("dbConnection") String connectionStr,
@Named("dbUser") String user,
@Named("dbPw") String pw,) {
return DriverManager.getConnection(connectionStr, user, pw);
}
Ahora simplemente cree su archivo de propiedades Java myconfig.properties
en la raíz de su classpath con
dbConnection = jdbc:mysql://localhost/test
dbUser = username
dbPw = password
o fusione la información de autorización de alguna otra fuente en las propiedades y estará listo.
Primero debe anotar el constructor para SomeClass
:
class SomeClass {
@Inject
SomeClass(@Named("JDBC URL") String jdbcUrl) {
this.jdbcUrl = jdbcUrl;
}
}
Prefiero usar anotaciones personalizadas, como esta:
class SomeClass {
@Inject
SomeClass(@JdbcUrl String jdbcUrl) {
this.jdbcUrl = jdbcUrl;
}
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.PARAMETER})
@BindingAnnotation
public @interface JdbcUrl {}
}
Entonces necesitas proporcionar un enlace en tu módulo:
public class SomeModule extends AbstractModule {
private final String jdbcUrl; // set in constructor
protected void configure() {
bindConstant().annotatedWith(SomeClass.JdbcUrl.class).to(jdbcUrl);
}
}
Luego, una vez que Guice crea SomeClass, inyectará el parámetro. Por ejemplo, si SomeOtherClass depende de SomeClass:
class SomeOtherClass {
@Inject
SomeOtherClass(SomeClass someClass) {
this.someClass = someClass;
}
A menudo, cuando crees que quieres inyectar una cadena, quieres inyectar un objeto. Por ejemplo, si la Cadena es una URL, a menudo inyecto un URI con una anotación de enlace.
Todo esto supone que hay un valor constante que puede definir en el momento de creación del módulo para la Cadena. Si el valor no está disponible en el momento de creación del módulo, puede utilizar AssistedInject .