どのように実装するOR論理春予選のために?

gstackoverflow:

私は、設定を次のようしています。

@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 {
}
Cepr0:

あなたはマーカーインタフェースの代わりに修飾子を使用した場合?例えば:

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;

あなたはのリストになるだろうmyBean1myBean12豆を。

そして、このために:

@Autowired private List<Marker2> myBeans;

あなたはのリストになるだろうmyBean2myBean12豆を。

この作品は、ウィル?

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;

地図はbeans3つの豆が含まれます:hihelloother(自分の名前は、地図の鍵であり、そのインスタンスはその値です)。

あなたが見つけることができるより多くの使用例テスト

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;
   }
}

その他の使用例は、この中で見るテスト

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=228983&siteId=1