Как внедрить коллекцию всех бинов определенного типа в Spring?

«Как внедрить коллекцию всех бинов определенного типа в Spring?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, Spring поддерживает автоматическое внедрение коллекций всех бинов, реализующих заданный тип или интерфейс.

Пример внедрения списка (List):

public interface PaymentService {
    void process();
}

@Service
public class CreditCardService implements PaymentService { ... }

@Service
public class PayPalService implements PaymentService { ... }

@Component
public class PaymentProcessor {
    // Spring внедрит все бины типа PaymentService
    @Autowired
    private List<PaymentService> allServices; // Содержит CreditCardService и PayPalService
}

Ключевые моменты:

  • Тип коллекции: Можно использовать List, Set или Map.
  • Управление порядком: Для упорядочивания элементов в List используйте аннотации @Order или @Priority на классах-бинах.
  • Способ внедрения: Работает с внедрением через поле, сеттер или конструктор.
  • Внедрение Map: При использовании Map<String, PaymentService> ключом будет имя бина (по умолчанию).