次の図に示すオブジェクト グラフをどのように作成しますか?
ユーザー オブジェクトは、2 つのデータベース バックエンドからの情報を結合する必要があります。
プライベート モジュールを使用して解決策を見つけました。
static class Service {
@Inject Dao daoA;
public void doSomething() {
daoA.doA();
}
}
static class Dao {
@Inject DataSource dataSource;
public void doA() {
dataSource.execute();
}
}
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.PARAMETER})
@BindingAnnotation
public @interface Connection {}
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.PARAMETER})
@BindingAnnotation
public @interface X {}
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.PARAMETER})
@BindingAnnotation
public @interface Y {}
static class DataSource {
@Connection @Inject String connection;
public void execute() {
System.out.println("execute on: " + connection);
}
}
static class XServiceModule extends PrivateModule {
@Override
protected void configure() {
bind(Service.class).annotatedWith(X.class).to(Service.class);
expose(Service.class).annotatedWith(X.class);
bindConstant().annotatedWith(Connection.class).to("http://server1");
}
}
static class YServiceModule extends PrivateModule {
@Override
protected void configure() {
bind(Service.class).annotatedWith(Y.class).to(Service.class);
expose(Service.class).annotatedWith(Y.class);
bindConstant().annotatedWith(Connection.class).to("http://server2");
}
}
public static void main(String[] args) {
Injector injector = Guice.createInjector(new XServiceModule(), new YServiceModule());
Service serviceX = injector.getInstance(Key.get(Service.class, X.class));
serviceX.doSomething();
Service serviceY = injector.getInstance(Key.get(Service.class, Y.class));
serviceY.doSomething();
}
これには、BindingAnnotations または単に一般的な @Named Annotation を使用できます。@Provides-Methods で使用するのが最も簡単だと思います。
@Provides
@Named("User1")
public SomeUser getUser(Service1 service) {
return service.getUser();
}
@Provides
@Named("User2")
public SomeUser getUser(Service2 service) {
return service.getUser();
}
その後:
@Inject
@Named("User1")
private SomeUser someuser;
...
Guice への支援型インジェクション拡張機能を使用して、から を取得するファクトリを生成Service
し、DataSource
そのファクトリを 2 つの異なる に適用する必要がありますService
。