Внедрение с использованием Spring Lots экземпляров bean-компонентов в карту/список без конфигурации xml

Как я могу внедрить в карту (или список) java bean экземпляры некоторых разных классов, используя spring, но без использования конфигураций xml (мы должны использовать только аннотации)? Я хочу иметь возможность указать конкретные экземпляры, которые будут введены в эту карту по имени или путем реализации класса

Экземпляры будут объявлены примерно так:

@Component ("instanceA") public class A implements I {
...
}

PS Для упрощения можно сначала предположить, что все экземпляры реализуют один и тот же интерфейс, но это не всегда будет так...

ваш вопрос кажется неполным, не могли бы вы добавить дополнительную информацию, например, при каких условиях вы хотите, чтобы ваши бобы были выбраны. Кроме того, если вы хотите, чтобы bean-компоненты были добавлены в список, они должны реализовать тот же интерфейс, иначе карта должна быть типа Object.

Raghvendra Garg 20.03.2019 08:02

Нет общего условия для выбора bean-компонентов, я хочу иметь возможность выбирать каждый конкретный экземпляр на основе имени или имени реализующего класса. Все они будут реализовывать один и тот же интерфейс (это обычное использование).

MS13 25.03.2019 13:07
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
335
2

Ответы 2

Вы можете использовать фабрику компонентов, чтобы получить доступ ко всем необходимым компонентам.

@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());

Я хочу выбирать экземпляры, а не выбирать их все

MS13 19.03.2019 13:37

@Qualifier вам поможет?

dehasi 19.03.2019 14:05

Я бы предпочел загружать bean-компоненты по классу реализации, а не по имени, потому что он более статически типизирован.

MS13 25.03.2019 13:11

Вы правы, но getBeansOfType() дает вам все компоненты, реализующие тип. Как вы собираетесь их фильтровать?

dehasi 25.03.2019 13:15

нет уже существующей аннотации, которая может сделать это за вас, но вы можете использовать @Bean и @Qualifier для получения желаемых результатов.

@Bean
public List<YourInterface> getList(@Qualifier("yourCherryPickedInterfaceImpl1") YourInterface yourCherryPickedInterfaceImpl1, @Qualifier("yourCherryPickedInterfaceImpl2") YourInterface yourCherryPickedInterfaceImpl2) {
    return Arrays.asList(new YourInterface[]{yourCherryPickedInterfaceImpl1, yourCherryPickedInterfaceImpl2});
}

Другие вопросы по теме