@Abderrazakk から提供されたリンクのおかげでこれを解決しましたが、リンクには指示があまり含まれていないため、ここにもサンプルソリューションを追加すると思いました。
プライベート GIN モジュールを使用すると、単一レベルの階層的注入を行うことができます。この場合、プライベート モジュール内に登録された型は、そのモジュール内で作成された他のインスタンスにのみ表示されます。プライベートでないモジュール内に登録された型は、引き続きすべてのモジュールで使用できます。
例
注入する (そして注入する) いくつかのサンプル タイプを用意しましょう。
public class Thing {
private static int thingCount = 0;
private int index;
public Thing() {
index = thingCount++;
}
public int getIndex() {
return index;
}
}
public class SharedThing extends Thing {
}
public class ThingOwner1 {
private Thing thing;
private SharedThing shared;
@Inject
public ThingOwner1(Thing thing, SharedThing shared) {
this.thing = thing;
this.shared = shared;
}
@Override
public String toString() {
return "" + this.thing.getIndex() + ":" + this.shared.getIndex();
}
}
public class ThingOwner2 extends ThingOwner1 {
@Inject
public ThingOwner2(Thing thing, SharedThing shared) {
super(thing, shared);
}
}
次のように 2 つのプライベート モジュールを作成します (2 つ目のモジュールには ThingOwner2 を使用)。
public class MyPrivateModule1 extends PrivateGinModule {
@Override
protected void configure() {
bind(Thing.class).in(Singleton.class);
bind(ThingOwner1.class).in(Singleton.class);
}
}
そして共有モジュール:
public class MySharedModule extends AbstractGinModule {
@Override
protected void configure() {
bind(SharedThing.class).in(Singleton.class);
}
}
次に、2 つのモジュールをインジェクターに登録します。
@GinModules({MyPrivateModule1.class, MyPrivateModule2.class, MySharedModule.class})
public interface MyGinjector extends Ginjector {
ThingOwner1 getOwner1();
ThingOwner2 getOwner2();
}
最後に、ThingOwner1 と ThingOwner2 の両方のインスタンスが、共有モジュールからの同じ SharedThing インスタンスを持っていることを確認できますが、プライベート登録からは異なる Thing インスタンスがあります。
System.out.println(injector.getOwner1().toString());
System.out.println(injector.getOwner2().toString());