これは最善の解決策ではないかもしれませんが、あなたにとってはうまくいくかもしれません。
動的入力を提供できるプロバイダーを実装できます。次に、そのプロバイダーをそれらを必要とするクラスに注入して、必要なオブジェクトを動的に作成できるようにします。
プロバイダーJavaDocからのスニペットは次のとおりです。
実装クラスは、Tを直接注入するのではなく、常にプロバイダーインスタンスを注入することを選択できます。これにより、複数のインスタンス、安全に変更して破棄したいインスタンス、スコープ外のインスタンス(@SessionScopedオブジェクト内から@RequestScopedオブジェクトを使用するなど)、または遅延初期化されるインスタンスにアクセスできる場合があります。
次のようになります。個人的には、インジェクターはインジェクションフレームワークの一部であるため、プロバイダーにインジェクターを注入することは問題ないと思います。目標は、インジェクターをアプリケーションコードから遠ざけることですが、これは確かにそうです。
public class FooProvider implements Provider<Foo>
@Inject
private Injector injector;
private String input;
public void setInput(String input){
this.input = input;
}
@Override
public Foo get(){
if(input.equals("bar")){
injector.getInstance(Bar.class); // Bar implements Foo
}
else{
injector.getInstance(Baz.class; // Baz implements Foo
}
}
}
その後、他の場所...
public class Goo{
@Inject
Provider<Foo> fooProvider;
public Foo goo(String input){
fooProvider.setInput(input);
return fooProvider.get();
}
}
重要なのは、各プロバイダーインスタンスがインジェクションポイントごとに一意であることを確認することです。これはデフォルトであると思います。このプロバイダーは可変状態であるため、意図したとおりでない限り、これをアプリケーションにスローすることはできません(マルチスレッド環境で間違ったことを行う可能性があります)。次に、より多くの予防策を講じる必要があります。