Что произойдет в Spring-приложении, если контейнер не сможет найти требуемый bean для внедрения?

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

Ответ

Во время создания контекста приложения (на этапе инъекции зависимостей) Spring выбросит исключение NoSuchBeanDefinitionException, что приведет к сбою инициализации контекста и остановке приложения.

Типичные причины:

  1. Отсутствует аннотация, определяющая bean (@Component, @Service, @Repository, @Controller, @Configuration).
  2. Компонент находится вне областей сканирования, указанных в @ComponentScan.
  3. Bean объявлен только в XML-конфигурации, которая не подключена.
  4. Зависимость запрашивается по имени (@Qualifier) или типу, который не соответствует ни одному bean.

Пример, вызывающий ошибку:

@Service
public class OrderService {
    @Autowired
    private PaymentProcessor processor; // NoSuchBeanDefinitionException, если PaymentProcessor не является bean
}

Способы решения/предотвращения:

  • Проверить сканирование пакетов: Убедиться, что класс с зависимостью находится в пакете, указанном в @ComponentScan.
  • Явное объявление бина: Создать bean через @Bean в классе с аннотацией @Configuration.
  • Сделать зависимость опциональной: Использовать @Autowired(required = false). Тогда поле останется null, если bean не найден.
  • Использовать Optional:
    @Autowired
    private Optional<PaymentProcessor> processor; // Будет пустым Optional, если bean отсутствует