私は、実行時にSpringアプリケーションによって検出された環境に応じて、サービスの3つの可能な実装の1つを条件付きで作成する必要があります。サービスAが利用可能な場合、サービスAを依存関係として使用する具体的な実装クラスを作成します。サービスAが利用できない場合は、依存関係としてサービスBを使用して実装を作成します。等々。サービスの可用性に基づく春のオートワイヤリング
実装に依存するクラスは、インターフェイスの自動配線を行い、特定の環境で選択されたサービスが何であるかには関係ありません。
この最初のスタブは、サービスが利用可能かどうかに応じてBeanまたはnullを返す複数の@Beanメソッドを実装し、@Autowire(required = false)という個別の@Configurationクラスを持つことでした。 @Autowiredフィールドのどれがnullでないかによって条件付きで実装を作成する2つの可能なサービス。
ここで問題となるのは、required = falseの場合、Springは候補の生成を待つかどうかを気にするようには見えません。つまり、実装を選択しようとするクラスは、required = false Beanのいずれかまたは両方が構築される前に構築されるため、正しく初期化できるかどうかにかかわらず、一方または両方が常にnullになることがあります。
この時点で私は穀粒に逆らっているような気がするので、この種のことを行うための「正しい」方法についてのアドバイスを探しています。いくつかの外部サービスまたは環境の可用性に基づいています。
プロファイルは正しい答えのようには見えません。サービス豆が選択したい実装を初期化しようとするまでわからないからです。私は文脈を作る時にそれを知りません。
@Orderでも目標は達成されません。 @BonditionalとBeanの存在についてのテスト(まだまだ構築されていない可能性があるので)はありません。 FactoryBeanにも同じ問題があります.FactoryBeanがインスタンスの作成を要求された時点で構築されていない可能性のあるBeanの有無をチェックするのは良いことではありません。
私が本当に必要とするのは、他のBeanの可用性に基づいてBeanを作成することですが、そのBeanが少なくとも初期化を試みた後にのみ作成してください。
3つの実装が何であるかについてもう少し言えますか? –
具体的な例を挙げると、可用性に応じて、外部のRedisキャッシュ、メモリ内のクラスタ化されたHazelcastキャッシュ、またはどちらも使用できない場合は、ダムのローカルHashMap(フォールバック)があります。 私は何を持っているかに応じて、利用可能なサービスが提供する特定のBeanを取得/配置する方法を知っているServiceインターフェイスの具体的な実装を構築します。 場合(Redisの豆)RedisImpl(Redisの豆を)返す 他の場合(hazelcast豆)HazelImpl(hazelcast豆)を返し、他の DumbHashImpl() –
は、だから私はやりたいかもしれないもののようなものです。明確にするために、環境に関連する特定のBeanの可用性がありますか?たとえば、純粋にdevでDumbHashImpl()を使用し、テストでRedisImplを使用し、prodでHazelImplを使用していますか? –