Spring: получить все Beans определенного интерфейса И типа

В моем приложении Spring Boot, предположим, что у меня есть интерфейс в Java:

public interface MyFilter<E extends SomeDataInterface> 

(хорошим примером является Spring открытый интерфейс ApplicationListener < E extends ApplicationEvent > )

и у меня есть пара реализаций вроде:

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

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

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

Затем в каком-то объекте мне интересно использовать все фильтры, которые реализуют MyFilter <SpecificDataInterface> , но NOT MyFilter <AnotherSpecificDataInterface>

Каким будет синтаксис для этого?

Ответ 1

Далее будет добавлен каждый экземпляр MyFilter с типом, который расширяет SpecificDataInterface как общий аргумент в List.

@Autowired
private List<MyFilter<? extends SpecificDataInterface>> list;

Ответ 2

Вы можете просто использовать

@Autowired
private List<MyFilter<SpecificDataInterface>> filters;

Ответ 3

В случае, если вы хотите карту, ниже код будет работать. Ключ - ваш определенный метод

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