Middle
48
questionbank

Как создать singleton-бин при запуске Spring приложения?

Получайте ответы на вопросы в реальном времени с Sobes Copilot
Ответ от нейросети sobes.tech

По умолчанию, singleton-бины в Spring создаются при первом обращении к ним (lazy loading). Чтобы создать singleton-бин при запуске приложения (eager loading), можно использовать следующие подходы:

  1. Использовать @Lazy(false) аннотацию:

    java

    Это наиболее явный способ указать, что конкретный бин должен быть инициализирован при старте Spring контекста. @Lazy(false) на уровне класса бина переопределяет любое глобальное или дефолтное поведение lazy loading.

  2. Конфигурация через XML:

    В XML-конфигурации Spring можно явно указать lazy-init="false" для определения бина:

    xml

    Этот атрибут управляет политикой инициализации для данного конкретного бина.

  3. Конфигурация через Java Code (с @Bean):

    При использовании конфигурации на основе Java-кода с @Configuration и @Bean, по умолчанию бины создаются при старте контекста. Однако, если вы включили глобальное lazy loading, можно переопределить его для конкретного бина:

    java

    Использование @Lazy(false) на методе с @Bean аналогично использованию ее на уровне класса с @Component.

  4. Глобальное отключение Lazy Loading:

    Можно отключить lazy loading глобально для всего приложения. Это не самый рекомендуемый подход, так как может увеличить время старта приложения, но он существует:

    • Через application.properties или application.yml:

      properties
    • Через Java Code:

      Можно настроить SpringApplicationBuilder:

      java

По умолчанию Spring Boot приложения с Spring Data JPA будут создавать бины репозиториев при старте. Зависимости между бинами также влияют на порядок их создания; бин, от которого зависят другие бины, обычно создается раньше.

Выбор способа зависит от контекста и предпочтений: @Lazy(false) на уровне бина наиболее гранулированный и явный, а глобальное отключение влияет на все бины.