web-dev-qa-db-ja.com

Guiceで文字列を変数にバインドする方法は?

私はギスに不慣れで、ここに素朴な質問があります。 Stringを特定の値にバインドできることを学びました。

bind(String.class)
        .annotatedWith(Names.named("JDBC URL"))
        .toInstance("jdbc:mysql://localhost/pizza");

しかし、Stringを可能な文字にバインドしたい場合はどうなりますか?

または私はそれがこのように説明できると思います:

「newSomeClass(StringstrParameter)」をGuiceに置き換えるにはどうすればよいですか?

21
eric2323223

まず、SomeClassのコンストラクターに注釈を付ける必要があります。

class SomeClass {
  @Inject
  SomeClass(@Named("JDBC URL") String jdbcUrl) {
    this.jdbcUrl = jdbcUrl;
  }
}

私は次のようなカスタムアノテーションを使用することを好みます:

class SomeClass {
  @Inject
  SomeClass(@JdbcUrl String jdbcUrl) {
    this.jdbcUrl = jdbcUrl;
  }

  @Retention(RetentionPolicy.RUNTIME)
  @Target({ElementType.FIELD, ElementType.PARAMETER})
  @BindingAnnotation
  public @interface JdbcUrl {}
}

次に、モジュールにバインディングを提供する必要があります。

public class SomeModule extends AbstractModule {
  private final String jdbcUrl; // set in constructor

  protected void configure() {
    bindConstant().annotatedWith(SomeClass.JdbcUrl.class).to(jdbcUrl);
  }
}

次に、GuiceがSomeClassを作成するときに、パラメーターを挿入します。たとえば、SomeOtherClassがSomeClassに依存している場合:

class SomeOtherClass {
  @Inject
  SomeOtherClass(SomeClass someClass) {
    this.someClass = someClass;
  }

多くの場合、文字列を挿入したい場合は、オブジェクトを挿入したいと思います。たとえば、文字列がURLの場合、バインディングアノテーションを付けて [〜#〜] uri [〜#〜] を挿入することがよくあります。

これはすべて、文字列のモジュール作成時に定義できる定数値があることを前提としています。モジュールの作成時に値が使用できない場合は、 AssistedInject を使用できます。

43
NamshubWriter

これはトピックから外れているかもしれませんが、Guiceを使用すると、必要なすべての文字列に明示的なバインディングを作成するよりもはるかに簡単に構成できます。あなたはそれらのための設定ファイルを持つことができます:

Properties configProps = Properties.load(getClass().getClassLoader().getResourceAsStream("myconfig.properties");
Names.bindProperties(binder(), configProps);

そして、すべての構成を注入する準備ができています。

@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);
}

次に、クラスパスのルートに Javaプロパティファイルmyconfig.propertiesを作成します。

dbConnection = jdbc:mysql://localhost/test
dbUser = username
dbPw = password

または、他のソースからの認証情報をプロパティにマージすると、設定が完了します。

20
Georg

GuiceのFAQ)で解決策を見つけました:

http://code.google.com/docreader/#p=google-guice&s=google-guice&t=FrequentlyAskedQuestions

MyModuleでアノテーションとString属性を定義することに加えて、SomeClassのインスタンスを取得するには、以下の行を記述する必要があります。

SomeClass instance = Guice.createInjector(new MyModule("any string i like to use")).getInstance(SomeClass.class);

しかし、ルートオブジェクト以外はInjector.getInstance()を使用すべきではないことを思い出したので、これを行うためのより良い方法はありますか?

0
eric2323223

Namedアノテーションを介して文字列を挿入することができました。

@Provides
@Named("stage")
String stage() {
    return domain;
}

class SomeClass {
   @Inject
   @Named("stage")
   String stageName;
}
0
Selvaram G