2009-10-14 12 views
20

私はGuiceを初めて勉強しました。ここには素朴な質問があります。私たちはを通じて特定の値に文字列をバインドすることができることを学びました:Guiceで文字列を変数にバインドする方法は?

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

しかし、私はすべての可能な文字に文字列をバインドしたい場合は何?

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

にはどうすればいいのGuiceで「新しい工ass(文字列strParameter)」を置き換えることができますか?

+2

DI(依存性注入)は、これらのすべてのトリックで、コードをより困難にし、その起源の目標を失った。多くの場合、依存関係を注入するのはずっと簡単です。コンテキストを1か所に保持してください。これにより、メンテナンスがずっと簡単になります。 –

答えて

37

あなた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は工assに依存している場合:

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

を多くの場合、あなたは文字列を挿入したいと思うとき、あなたがオブジェクトを挿入します。たとえば、StringがURLの場合、私はしばしば束縛注釈を持つURIを挿入します。

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

+0

なぜダウン投票? – NamshubWriter

0

私はGuiceののよくある質問で解決策を見つける:MyModuleというにおける注釈や文字列の属性を定義するほか

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

を、私は工assのインスタンスを取得するために、線の下に記述する必要があります。

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

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

18

これは話題にはならないかもしれませんが、Guiceは必要なすべてのStringに対して明示的なバインディングを書くよりもずっと簡単です。あなたはそれらのための設定ファイルを持つことができます。今だけ

であなたのクラスパスのルートでご Java properties file myconfig.propertiesを作成

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

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

し、すべての設定は、注射の準備ができているほら

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

または他のソースからの認証情報をプロパティにマージしてください。

関連する問題