Ответ 1
Далее будет добавлен каждый экземпляр MyFilter с типом, который расширяет SpecificDataInterface как общий аргумент в List.
@Autowired
private List<MyFilter<? extends SpecificDataInterface>> list;
В моем приложении 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>
Каким будет синтаксис для этого?
Далее будет добавлен каждый экземпляр MyFilter с типом, который расширяет SpecificDataInterface как общий аргумент в List.
@Autowired
private List<MyFilter<? extends SpecificDataInterface>> list;
Вы можете просто использовать
@Autowired
private List<MyFilter<SpecificDataInterface>> filters;
В случае, если вы хотите карту, ниже код будет работать. Ключ - ваш определенный метод
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));
}