Как Spring Boot управляет порядком создания бинов?

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

Ответ

Spring Boot определяет порядок создания бинов на основе их зависимостей и явных указаний. Основные механизмы:

1. Неявные зависимости через @Autowired Если бин A зависит от бина B (через внедрение), Spring сначала создаст B.

2. Явное указание с помощью @DependsOn Аннотация принудительно задаёт зависимости, которые должны быть созданы первыми.

@Component
@DependsOn({"databaseInitializer", "configLoader"})
public class ServiceBean {
    // ...
}

3. Управление порядком в коллекциях через @Order Влияет на порядок бинов в инжектируемых списках (например, List<Processor>), но не на порядок их создания в контексте.

4. Фазы жизненного цикла с SmartLifecycle Бины, реализующие этот интерфейс, могут управлять порядком старта и остановки через метод getPhase() (меньшее значение — более высокий приоритет).

Почему это важно? Порядок гарантирован только для бинов с явными зависимостями. Для независимых бинов порядок создания не определён. Используйте @DependsOn для сложных сценариев инициализации, чтобы избежать ошибок NullPointerException.