Java-spring web-app では、Bean を動的に注入できるようにしたいと考えています。たとえば、2 つの異なる実装を持つインターフェイスがあります。
私のアプリでは、いくつかのプロパティ ファイルを使用してインジェクションを構成しています。
#Determines the interface type the app uses. Possible values: implA, implB
myinterface.type=implA
私のインジェクションは、プロパティ ファイル内のプロパティ値を条件付きで中継して実際にロードされました。たとえば、この場合 myinterface.type=implA MyInterface を注入する場所はどこでも、注入される実装は ImplA になります ( Conditional アノテーションを拡張することで実現しました)。
実行時にそれを希望します-プロパティが変更されると、次のことが起こります(サーバーの再起動なし):
- 適切な実装が注入されます。たとえば、
myinterface.type=implB
ImplB を設定すると、MyInterface が使用されている場所にいつでも注入されます - Spring Environmentを新しい値でリフレッシュし、Bean にも再注入する必要があります。
コンテキストを更新することを考えましたが、それは問題を引き起こします。インジェクションにセッターを使用し、プロパティが再構成されたらそれらのセッターを再利用することを考えました。そのような要件のための作業慣行はありますか?
何か案は?
アップデート
一部の人が示唆したように、両方の実装 (ImplA と ImplB) を保持するファクトリ/レジストリを使用し、関連するプロパティをクエリして正しいものを返すことができます。もしそうしても、私にはまだ 2 番目の課題があります。それは環境です。たとえば、レジストリが次のようになっているとします。
@Service
public class MyRegistry {
private String configurationValue;
private final MyInterface implA;
private final MyInterface implB;
@Inject
public MyRegistry(Environmant env, MyInterface implA, MyInterface ImplB) {
this.implA = implA;
this.implB = implB;
this.configurationValue = env.getProperty("myinterface.type");
}
public MyInterface getMyInterface() {
switch(configurationValue) {
case "implA":
return implA;
case "implB":
return implB;
}
}
}
プロパティが変更されたら、環境に再注入する必要があります。そのための提案はありますか?
コンストラクターの代わりにメソッド内でその env を照会できることはわかっていますが、これはパフォーマンスの低下であり、環境を再注入するための ider を考えたいと思います (これもセッター注入を使用する可能性がありますか?)。