requestscoped provides how google binding guice

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 .