古いスレッドを掘り起こしていることは知っていますが、これをグーグルで検索している他の人と私の調査結果を共有したかったのです。
この機能はかなり前に要求されていましたが、まだサポートされていません。これを行うための最も適切なアノテーションは、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 配線をサポートしていますが、配線が少し面倒です。この単体テストは、私が見つけた最良の例のように見えました。