0

@Named仮に、注釈を使用して、プロパティ ファイルからクラス フィールドに値を挿入する可能性があります。

@Inject
@Named("nameLengthMin")
private int nameLengthMin;

@Namedキー パラメーターを必要とせず、代わりにフィールド名をキーとして使用してプロパティ ファイルを検索するバージョンのアノテーションを作成したいと考えています。

// takes field name as key
@Inject
@Named
private int nameLengthMin;

私は、guice を使用してこれを達成する方法を理解しようとしていますが、guice と独自の注釈を書くのは初めてです。

注釈付きフィールドをパラメーターとして与えることができる注釈を作成するにはどうすればよいですか?

4

2 に答える 2

1

これは、カスタム インジェクションを使用することで可能になるはずです。 https://code.google.com/p/google-guice/wiki/CustomInjectionsを参照してください。

Inject と Named を使用する場合は、guice の内部実装に対処する必要があるため、カスタムの "InjectProperty" バインディング アノテーション (InjectLogger など) を作成することをお勧めします。次に、例に従うと、「PropertyMembersInjector」はプロパティを読み取り、フィールド名が有効なキーであるかどうかを確認してから、プロパティ値をキャスト/変換してフィールドに設定できます。いくつかのコーディングになりますが、実行可能です。

于 2013-07-18T21:24:25.623 に答える
0

古いスレッドを掘り起こしていることは知っていますが、これをグーグルで検索している他の人と私の調査結果を共有したかったのです。

この機能はかなり前に要求されていましたが、まだサポートされていません。これを行うための最も適切なアノテーションは、JSR 250@Resourceアノテーションです。@jan-galinskiは間違っていませんが、この作業をすでに行っているサードパーティのソリューションがあります.

GuiceyFruitはこの機能を追加しましたが、放棄されたようです (すべての機能が Guice 3 で動作するわけではありません)。それにもかかわらず、ここにそれがどのように行われるかの例があります

@GrabResolver(name='GuiceyFruit', root='http://guiceyfruit.googlecode.com/svn/repo/releases')
@Grab(group='org.guiceyfruit', module='guiceyfruit-spring', version='2.0')
@Grab(group='com.google.inject', module='guice', version='3.0')
import javax.annotation.Resource;
import com.google.inject.name.Names;
import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import org.guiceyfruit.spring.SpringModule;

public class Main {
    public static void main(String[] args) {
        Box box = new Box();
        System.out.println("thingOne before injection='"+box.thingOne+"'");
        System.out.println("thingTwo before injection='"+box.thingTwo+"'");
        Guice.createInjector(new SpringModule(), new AbstractModule() {
            @Override
            protected void configure() {
                bind(String.class).annotatedWith(Names.named("thingOne")).toInstance("THING ONE");
                bind(String.class).annotatedWith(Names.named("thingTwo")).toInstance("THING TWO");
            }
        }).injectMembers(box);
        System.out.println("thingOne after injection='"+box.thingOne+"'");
        System.out.println("thingTwo after injection='"+box.thingTwo+"'");
    }

    public static class Box {
        @Resource public String thingOne;
        @Resource public String thingTwo;
    }
}

mycila Guice Extensionsも別のオプションです (これはまだ維持されており、より優れたモジュール性を提供するため、私が推奨するものです)。この機能の追加をリクエストしたので、すぐに利用できるようになるはずです。それができたら、次のように使用します。

@Grab(group='com.google.inject', module='guice', version='3.0')
@Grab(group='com.mycila.guice.extensions', module='mycila-guice-jsr250', version='3.6.ga')
import javax.annotation.Resource;
import com.google.inject.name.Names;
import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.mycila.guice.ext.jsr250.Jsr250Module;
import com.mycila.guice.ext.closeable.CloseableModule;

public class Main {
    public static void main(String[] args) {
        Box box = new Box();
        System.out.println("thingOne before injection='"+box.thingOne+"'");
        System.out.println("thingTwo before injection='"+box.thingTwo+"'");
        Guice.createInjector(new Jsr250Module(), new CloseableModule(), new AbstractModule() {
            @Override
            protected void configure() {
                bind(String.class).annotatedWith(Names.named("thingOne")).toInstance("THING ONE");
                bind(String.class).annotatedWith(Names.named("thingTwo")).toInstance("THING TWO");
            }
        }).injectMembers(box);
        System.out.println("thingOne after injection='"+box.thingOne+"'");
        System.out.println("thingTwo after injection='"+box.thingTwo+"'");
    }

    public static class Box {
        @Resource public String thingOne;
        @Resource public String thingTwo;
    }
}

最後に、Netflix のGovernatorも @Resource 配線をサポートしていますが、配線が少し面倒です。この単体テストは、私が見つけた最良の例のように見えました。

于 2015-01-23T16:45:30.130 に答える