私は、設定を次のようしています。
@Qualifier1
@Qualifier2
@Bean
public MyBean bean1(){...}
@Qualifier2
@Qualifier3
@Bean
public MyBean bean2(){...}
@Qualifier1
@Qualifier2
@Qualifier3
@Bean
public MyBean bean3(){...}
@Qualifier3
@Bean
public MyBean bean4(){...}
@Qualifier1
@Bean
public MyBean bean5(){...}
そして、それは注射場所であります:
@Qualifier2
@Qualifier3
@Autowired:
private List<MyBean> beans;
デフォルトでは、春には、使用してAND
、それぞれのロジックを@Qualifier
だから、bean2
およびbean3
注入されます。
しかし、私は持っていたいOR
、私は豆を期待しているもののためのロジックをbean1
bean2
bean3
してbean4
注入されます
どのように私はそれを達成することができますか?
PS
@Qualifier
私は、各注釈のメタアノテーションを作成する必要がありますので、注釈は繰り返しではありません。
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface Qualifier1 {
}
あなたはマーカーインタフェースの代わりに修飾子を使用した場合?例えば:
public class MyBean1 extends MyBean implements Marker1 {}
public class MyBean2 extends MyBean implements Marker2 {}
public class MyBean12 extends MyBean implements Marker1, Marker2 {}
そして、これを使用しました:
@Bean
public MyBean1 myBean1() {
//...
}
@Bean
public MyBean2 myBean2() {
//...
}
@Bean
public MyBean12 myBean12() {
//...
}
この:
@Autowired private List<Marker1> myBeans;
あなたはのリストになるだろうmyBean1
とmyBean12
豆を。
そして、このために:
@Autowired private List<Marker2> myBeans;
あなたはのリストになるだろうmyBean2
とmyBean12
豆を。
この作品は、ウィル?
UPDATE I
カスタムFactoryBeanの
私は実装TagsFactoryBeanクラスと@Tagsのあなたの仕事を(私は願っています:))を解決するために使用できる注釈を。
まず、とあなたの豆をマーク@Tags
注釈:
@Tags({"greeting", "2letters"})
@Bean
public Supplier<String> hi() {
return () -> "hi";
}
@Tags({"parting", "2letters"})
@Bean
public Supplier<String> by() {
return () -> "by";
}
@Tags("greeting")
@Bean
public Supplier<String> hello() {
return () -> "hello";
}
@Tags("parting")
@Bean
public Supplier<String> goodbye() {
return () -> "goodbye";
}
@Tags("other")
@Bean
public Supplier<String> other() {
return () -> "other";
}
そして、準備TagsFactoryBean
:
@Bean
public TagsFactoryBean words() {
return TagsFactoryBean.<Supplier>builder()
.tags("greeting", "other")
.type(Supplier.class)
.generics(String.class)
.build();
}
ここでtags
豆選択されるべき、所望のタグの配列でtype
選択された豆型であり、generics
豆の一般的なタイプのアレイです。最後のパラメータはオプションで、あなたの豆は、汎用されている場合にのみ使用する必要があります。
そして、あなたがそれを使用することができます@Qualifier
(そうでない場合は、春のすべてのBean注入のアノテーションSupplier<String>
タイプ):
@Autowired
@Qualifier("words")
private Map<String, Supplier<String>> beans;
地図はbeans
3つの豆が含まれます:hi
、hello
とother
(自分の名前は、地図の鍵であり、そのインスタンスはその値です)。
あなたが見つけることができるより多くの使用例テスト。
UPDATE II
カスタムAutowireCandidateResolver
@bhoslevirajのおかげ勧告は、私が実装TaggedAutowireCandidateResolver希望豆をオートワイヤリングのプロセスを簡素化します。ちょうどあなたの豆と同じタグを持つautowiredコレクションをマークし、あなたはそれらをコレクションに注入されます:
@Autowired
@Tags({"greeting", "other"})
private Map<String, Supplier<String>> greetingOrOther;
@Configuration
static class Beans {
@Tags({"greeting", "2symbols", "even"})
@Bean
public Supplier<String> hi() {
return () -> "hi";
}
@Tags({"parting", "2symbols", "even"})
@Bean
public Supplier<String> by() {
return () -> "by";
}
@Tags({"greeting", "5symbols", "odd"})
@Bean
public Supplier<String> hello() {
return () -> "hello";
}
@Tags({"parting", "7symbols", "odd"})
@Bean
public Supplier<String> goodbye() {
return () -> "goodbye";
}
@Tags({"other", "5symbols", "odd"})
@Bean
public Supplier<String> other() {
return () -> "other";
}
}
あなたは豆だけでなく、他のコレクションを注入するためだけでなく、地図を使用することができます。
それはあなたが登録する必要が働くようにするにはCustomAutowireConfigurer
、アプリケーション内のBeanをし、それを提供TaggedAutowireCandidateResolver
:
@Configuration
public class AutowireConfig {
@Bean
public CustomAutowireConfigurer autowireConfigurer(DefaultListableBeanFactory beanFactory) {
CustomAutowireConfigurer configurer = new CustomAutowireConfigurer();
beanFactory.setAutowireCandidateResolver(new TaggedAutowireCandidateResolver());
configurer.postProcessBeanFactory(beanFactory);
return configurer;
}
}
その他の使用例は、この中で見るテスト。