Как я могу внедрить в карту (или список) java bean экземпляры некоторых разных классов, используя spring, но без использования конфигураций xml (мы должны использовать только аннотации)? Я хочу иметь возможность указать конкретные экземпляры, которые будут введены в эту карту по имени или путем реализации класса
Экземпляры будут объявлены примерно так:
@Component ("instanceA") public class A implements I {
...
}
PS Для упрощения можно сначала предположить, что все экземпляры реализуют один и тот же интерфейс, но это не всегда будет так...
Нет общего условия для выбора bean-компонентов, я хочу иметь возможность выбирать каждый конкретный экземпляр на основе имени или имени реализующего класса. Все они будут реализовывать один и тот же интерфейс (это обычное использование).




Вы можете использовать фабрику компонентов, чтобы получить доступ ко всем необходимым компонентам.
@Autowired
private ListableBeanFactory beanFactory;
beansOfType.getBeansOfType() возвращает карту BeanName -> Bean.
Вам просто нужно знать имена бинов, которые вы хотите «внедрить». Список необходимых BeanNames;
Затем вы можете взять только необходимые бобы.
Map<String, YourInterface> beansOfType = beanFactory.getBeansOfType(YourInterface.class);
List<YourInterface> necessaryBeanNames.stream().map(b-> beansOfType.get(b)).filter(b -> b != null).collect(toList());
Я хочу выбирать экземпляры, а не выбирать их все
@Qualifier вам поможет?
Я бы предпочел загружать bean-компоненты по классу реализации, а не по имени, потому что он более статически типизирован.
Вы правы, но getBeansOfType() дает вам все компоненты, реализующие тип. Как вы собираетесь их фильтровать?
нет уже существующей аннотации, которая может сделать это за вас, но вы можете использовать @Bean и @Qualifier для получения желаемых результатов.
@Bean
public List<YourInterface> getList(@Qualifier("yourCherryPickedInterfaceImpl1") YourInterface yourCherryPickedInterfaceImpl1, @Qualifier("yourCherryPickedInterfaceImpl2") YourInterface yourCherryPickedInterfaceImpl2) {
return Arrays.asList(new YourInterface[]{yourCherryPickedInterfaceImpl1, yourCherryPickedInterfaceImpl2});
}
ваш вопрос кажется неполным, не могли бы вы добавить дополнительную информацию, например, при каких условиях вы хотите, чтобы ваши бобы были выбраны. Кроме того, если вы хотите, чтобы bean-компоненты были добавлены в список, они должны реализовать тот же интерфейс, иначе карта должна быть типа Object.