Cómo implementar la lógica OR para la fase de clasificación de la primavera?

gstackoverflow:

He siguiente configuración:

@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(){...}

Y es el lugar de inyección:

@Qualifier2
@Qualifier3
@Autowired:
private List<MyBean> beans;

Por defecto primavera utiliza ANDla lógica para cada@Qualifier

Así bean2y bean3será inyectado.

Pero yo quiero tener ORla lógica de esas cosas por lo que espero habas bean1 bean2 bean3y bean4para ser inyectado

¿Cómo puedo lograrlo?

PD

@Qualifier anotación no es repetible, así que tengo para crear anotaciones meta para cada anotación:

@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface Qualifier1 {
}
Cepr0:

Lo que si se ha utilizado interfaces de marcadores en vez de eliminatorias? Por ejemplo:

public class MyBean1 extends MyBean implements Marker1 {}

public class MyBean2 extends MyBean implements Marker2 {}

public class MyBean12 extends MyBean implements Marker1, Marker2 {}

Luego, utilizando la siguiente:

@Bean
public MyBean1 myBean1() {
    //...
}

@Bean
public MyBean2 myBean2() {
    //...
}

@Bean
public MyBean12 myBean12() {
    //...
}

y esto:

@Autowired private List<Marker1> myBeans;

Se podría obtener una lista de myBean1y myBean12frijoles.

Y para esto:

@Autowired private List<Marker2> myBeans;

Se podría obtener una lista de myBean2y myBean12frijoles.

esto funcionara?

ACTUALIZACIÓN I

FactoryBean personalizada

He implementado TagsFactoryBean clase y @Tags anotación que se puede utilizar para resolver su tarea (espero :)).

En primer lugar, marcar sus granos con @Tagsanotación:

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

A continuación, preparar TagsFactoryBean:

@Bean
public TagsFactoryBean words() {
    return TagsFactoryBean.<Supplier>builder()
            .tags("greeting", "other")
            .type(Supplier.class)
            .generics(String.class)
            .build();
}

Aquí tagses un conjunto de etiquetas deseadas cuyos granos deben ser seleccionados, typees un tipo de granos seleccionados, y genericsuna gran variedad de tipos genéricos de los granos. El último parámetro es opcional y sólo debe utilizarse si sus granos son genéricos.

A continuación, puede utilizarlo con @Qualifierla anotación (de lo contrario primavera inyecta todos los granos de Supplier<String>tipo):

@Autowired
@Qualifier("words")
private Map<String, Supplier<String>> beans;

El Mapa beanscontendrá tres granos: hi, helloy other(su nombre son las claves del mapa y sus casos son sus valores).

Más ejemplos de uso se pueden encontrar en las pruebas .

ACTUALIZACIÓN II

AutowireCandidateResolver personalizada

Gracias a @bhosleviraj recomendación , que implementan TaggedAutowireCandidateResolver que simplifica el proceso de Autowiring los granos deseados. Simplemente marque sus frijoles y la colección autowired con las mismas etiquetas y obtendrá las inyectaron en la colección:

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

Puede usar no sólo el mapa de inyección de granos, sino también a otras colecciones.

Para que funcione hay que registrarse un CustomAutowireConfigurerfrijol en su aplicación y dotarla de TaggedAutowireCandidateResolver:

@Configuration
public class AutowireConfig {
   @Bean
   public CustomAutowireConfigurer autowireConfigurer(DefaultListableBeanFactory beanFactory) {
      CustomAutowireConfigurer configurer = new CustomAutowireConfigurer();
      beanFactory.setAutowireCandidateResolver(new TaggedAutowireCandidateResolver());
      configurer.postProcessBeanFactory(beanFactory);
      return configurer;
   }
}

Más ejemplos de uso ver en esta prueba .

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=228986&siteId=1
Recomendado
Clasificación