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?
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;
Vous pouvez simplement utiliser
@Autowired
private List<MyFilter<SpecificDataInterface>> filters;
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));
}