これは風変わりなユースケースであるため、理解するにはある程度の忍耐が必要であり、風変わりなソリューションが必要になる場合があります。
コンテキスト
@Bean
ではなくメソッドによって作成された、コンテキストに存在する特定の Bean インスタンスに対して自動アクションを実行する、Spring で使用するライブラリを作成しています@ComponentScan
。可能であれば、Bean はタイプではなく、他の手段、できればファクトリ メソッドの注釈によって区別できる必要があります。
これが理想的なケースです。たとえば、Bean を生成する方法が 2 つあるとします。
@Bean
public SomeType makeSome() {...}
@Bean
@Special
public SomeOtherType makeOther() {...}
ここで、2 番目の Bean は、それを作成したメソッドの注釈のために特別です。@Special
しかし、それを区別できるようにするメカニズムはオプションです。
では、どうにかして特別な豆だけを手に入れたい。
警告
すべての Bean が同じインターフェースを実装する場合、タイプごとに注入できることは承知しています。ただし、これは可能な限り透過的に機能する必要があり、既存のアプリへの変更は可能な限り少なくする必要があります。
潜在的なアプローチ
私が念頭に置いている2つの広範なアプローチを次に示します。
1) Bean を登録するプロセスにジャックし、Bean インスタンスをある種のコンテナーに透過的にラップします (この部分は実行可能であると確信しています)。例えば
public void registerBean(Object bean, ApplicationContext ctx) {
ctx.register(bean); //do the usual
ctx.register(new Wrapper(bean); //register it wrapped as well
}
次に、 type のすべての Bean をすべて注入しますWrapper
。ここでの問題は明らかに重複です...代わりに、インターフェイスを実装するプロキシインスタンスをオンザフライで生成できるWrapper
ので、同時に元のBeanとラッパーとして機能できます。私はエキゾチックなソリューションでも大丈夫だと言いましたよね?
2) Spring はすでに Bean候補を実際の登録済み Bean と区別しています (たとえば@ComponentScan
、パッケージ、注釈などで候補をフィルタリングできます)。このプロセスに参加して、後でそれらの Bean インスタンスを区別できるようにするいくつかの有用なメタデータ (ファクトリ メソッドなど) をまだ含んでいる候補記述子を取得したいと考えています。