1

Guice を使い始めたばかりなので、私の理解は完全に間違っている可能性があります。

インターフェイスFooと実装がありますFooImp

モジュールで次のコードを使用して挿入しました。

bind(Foo.class).annotatedWith("Foo").toInstance(foo);  // foo is an instance of FooImp

Foo次に、「Foo」という名前の注釈を持つインスタンスがどこに置き換えられるか、私のコードで今推測しfooます ?

@Named("Foo")
Foo fooInst;   // fooInst will be foo at runtime?

私が正しければ、どうすればこれを達成できますか:

public Foo doSomething() {  // for some reason there must be no arguments
    @Named("Foo")
    Foo fooInst;   // injecting here seems not allowed...?
    fooInst.do();
}
4

3 に答える 3

4

あなたが想定していることは完全には正しくありません: Guice は依存性注入に使用されます。つまり、別のクラスのコンストラクターにインターフェイス/クラスを注入できます。

Fooインターフェイスがあり、それが implementation であるとしましょうFooImplBar次に、の実装に依存するクラスもありますFoo

public class Bar {

    private Foo foo;

    @Inject
    public Bar(@Named("foo") Foo foo) {
        this.foo = foo;
    }

    //some other methods
}

あなたの Guice-module に書く必要があります

bind(Foo.class).annotatedWith(Names.named("Foo")).toInstance(foo);
//let's say this is part of the module MyModule extends AbstractModule

これを設定すると、Guice のInjector-class を使用してオブジェクトを作成する main-method を作成できます。そのようです:

Injector injector = Guice.createInjector(new MyModule());
Bar bar = injector.getInstance(Bar.class);
//do something with bar

これがお役に立てば幸いです。ご不明な点がございましたら、お気軽にお問い合わせください。

ヒント: Guiceの Web サイトを確認し、そこにあるビデオを見て、wiki を注意深く読んでください。Guice は非常に優れたツールですが、使用する前に少し勉強する必要があります。幸運を!


追加: 私の意見では、使用@Namedは悪いコードスタイルです。独自の注釈をより適切に定義できます。例えば:

@BindingAnnotation
@Target({ FIELD, PARAMETER, METHOD })
@Retention(RUNTIME)
public @interface FooAnnotation {
}

次に、クラスで置き換え@Named("foo")、モジュールで置き換えます。@FooAnnotationBarNames.named("Foo")FooAnnotation.class

于 2013-07-30T19:07:15.540 に答える
1

残念ながら、ローカル変数に注釈を配置することはできません。この制限は、Guice ではなく Java に由来します。この回答によると、将来の Java バージョンでこの機能を利用できるようになることが期待されています。

ただし、これがうまくいくとしても、良い習慣ではないことに注意してください。依存性注入の考え方は、クラスの外部から依存性を変更する機能です。ローカル変数は、クラスの外部から変更できないため、これには当てはまりません。

于 2013-07-30T18:54:48.790 に答える