web-dev-qa-db-fra.com

Spring: récupère tous les haricots de certains types d'interface ET

Dans mon application Spring Boot, supposons que j’ai une interface en Java:

public interface MyFilter<E extends SomeDataInterface> 

(un bon exemple est l'interface publique ApplicationListener de Spring <E étend ApplicationEvent> )

et j'ai quelques implémentations comme:

@Component
public class DesignatedFilter1 implements MyFilter<SpecificDataInterface>{...}

@Component
public class DesignatedFilter2 implements MyFilter<SpecificDataInterface>{...}

@Component
public class DesignatedFilter3 implements MyFilter<AnotherSpecificDataInterface>{...}

Ensuite, dans certains objets, je suis intéressé à utiliser tous les filtres qui implémentent MyFilter <SpecificDataInterface> mais PAS MyFilter <AnotherSpecificDataInterface>

Quelle serait la syntaxe pour cela?

34
Askar Ibragimov

Ce qui suit va injecter chaque instance de MyFilter dont le type s'étend dans SpecificDataInterface en tant qu'argument générique dans la liste.

@Autowired
private List<MyFilter<? extends SpecificDataInterface>> list;
60
mh-dev

Vous pouvez simplement utiliser

@Autowired
private List<MyFilter<SpecificDataInterface>> filters;
9
Issam EL-ATIF

Si vous voulez une carte, le code ci-dessous fonctionnera. La clé est votre méthode définie

private Map<String, MyFilter> factory = new HashMap<>();

@Autowired
public ReportFactory(ListableBeanFactory beanFactory) {
  Collection<MyFilter> interfaces = beanFactory.getBeansOfType(MyFilter.class).values();
  interfaces.forEach(filter -> factory.put(filter.getId(), filter));
}
0
Quang Nguyen