私はギスに不慣れで、ここに素朴な質問があります。 Stringを特定の値にバインドできることを学びました。
bind(String.class)
.annotatedWith(Names.named("JDBC URL"))
.toInstance("jdbc:mysql://localhost/pizza");
しかし、Stringを可能な文字にバインドしたい場合はどうなりますか?
または私はそれがこのように説明できると思います:
「newSomeClass(StringstrParameter)」をGuiceに置き換えるにはどうすればよいですか?
まず、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 を使用できます。
これはトピックから外れているかもしれませんが、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
または、他のソースからの認証情報をプロパティにマージすると、設定が完了します。
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()を使用すべきではないことを思い出したので、これを行うためのより良い方法はありますか?
Named
アノテーションを介して文字列を挿入することができました。
@Provides
@Named("stage")
String stage() {
return domain;
}
class SomeClass {
@Inject
@Named("stage")
String stageName;
}