Рубрики
Без рубрики

Ленивая инициализация в Spring Boot 2

Узнайте, как настроить ленивую инициализацию в Spring Boot.

Автор оригинала: baeldung.

1. Обзор

В этом уроке мы увидим, как настроить ленивую инициализацию на уровне приложения, начиная с Spring Boot 2.2.

2. Ленивая инициализация

По умолчанию в Spring все определенные бобы и их зависимости создаются при создании applicationcontext.

В отличие от этого, когда мы настраиваем боб с ленивой инициализацией, боб будет создан и его зависимости будут введены только тогда, когда они понадобятся.

3. Зависимость Maven

Чтобы получить Spring Boot в нашем приложении, нам нужно включить его в наш путь к классу.

С Maven мы можем просто добавить | spring-boot-starter dependency :


    
        org.springframework.boot
        spring-boot-starter
        2.4.3
    

4. Включите Ленивую Инициализацию

Spring Boot 2 вводит свойство spring.main.lazy-initialization , облегчающее настройку ленивой инициализации во всем приложении.

Установка значения свойства в истинный это означает, что все бобы в приложении будут использовать ленивую инициализацию.

Давайте настроим это свойство в нашем конфигурационном файле application.yml :

spring:
  main:
    lazy-initialization: true

Или, если это так, в нашем файле application.properties :

spring.main.lazy-initialization=true

Эта конфигурация влияет на все бобы в контексте. Таким образом, если мы хотим настроить ленивую инициализацию для конкретного компонента, мы можем сделать это с помощью подхода @Lazy .

Более того, мы можем использовать новое свойство в сочетании с аннотацией @Lazy , установленной в false .

Или, другими словами, все определенные бобы будут использовать ленивую инициализацию, за исключением тех, которые мы явно настраиваем с помощью @Lazy(false) .

4.1. Использование SpringApplicationBuilder

Другой способ настроить ленивую инициализацию-использовать метод SpringApplicationBuilder :

SpringApplicationBuilder(Application.class)
  .lazyInitialization(true)
  .build(args)
  .run();

В приведенном выше примере мы используем метод lazy Initialization для управления тем, следует ли инициализировать приложение лениво.

4.2. Использование приложения Spring

В качестве альтернативы мы также можем использовать класс Spring Application :

SpringApplication app = new SpringApplication(Application.class);
app.setLazyInitialization(true);
app.run(args);

Здесь мы используем метод set Lazy Initialization для настройки ленивой инициализации нашего приложения.

Следует помнить, что свойства, определенные в файлах свойств приложения, имеют приоритет над флагами, установленными с помощью SpringApplication или SpringApplicationBuilder .

5. Бегите

Давайте создадим простой сервис, который позволит нам протестировать то, что мы только что описали.

Добавив сообщение в конструктор, мы точно узнаем, когда будет создан боб.

public class Writer {

    private final String writerId;

    public Writer(String writerId) {
        this.writerId = writerId;
        System.out.println(writerId + " initialized!!!");
    }

    public void write(String message) {
        System.out.println(writerId + ": " + message);
    }
    
}

Кроме того, давайте создадим приложение Spring и введем сервис, который мы создали ранее.

@SpringBootApplication
public class Application {

    @Bean("writer1")
    public Writer getWriter1() {
        return new Writer("Writer 1");
    }

    @Bean("writer2")
    public Writer getWriter2() {
        return new Writer("Writer 2");
    }

    public static void main(String[] args) {
        ApplicationContext ctx = SpringApplication.run(Application.class, args);
        System.out.println("Application context initialized!!!");

        Writer writer1 = ctx.getBean("writer1", Writer.class);
        writer1.write("First message");

        Writer writer2 = ctx.getBean("writer2", Writer.class);
        writer2.write("Second message");
    }
}

Давайте установим значение свойства spring.main.lazy-initialization в false и запустим наше приложение.

Writer 1 initialized!!!
Writer 2 initialized!!!
Application context initialized!!!
Writer 1: First message
Writer 2: Second message

Как мы видим, бобы были созданы при запуске контекста приложения.

Теперь давайте изменим значение spring.main.lazy-initialization на true и снова запустим наше приложение.

Application context initialized!!!
Writer 1 initialized!!!
Writer 1: First message
Writer 2 initialized!!!
Writer 2: Second message

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

6. Эффекты ленивой инициализации

Включение ленивой инициализации во всем приложении может привести как к положительным, так и к отрицательным эффектам.

Давайте поговорим о некоторых из них, как они описаны в официальном анонсе нового функционала:

  1. Ленивая инициализация может уменьшить количество бобов, созданных при запуске приложения – следовательно, мы можем улучшить время запуска приложения
  2. Поскольку ни один из бобов не создается до тех пор, пока они не понадобятся, мы могли бы замаскировать проблемы, получив их во время выполнения, а не во время запуска
  3. Эти проблемы могут включать ошибки нехватки памяти, неправильные конфигурации или найденные ошибки определения класса
  4. Кроме того, когда мы находимся в веб – контексте, запуск создания боба по требованию увеличит задержку HTTP-запросов -создание боба повлияет только на первый запрос, но это может негативно повлиять на балансировку нагрузки и автоматическое масштабирование .

7. Заключение

В этом уроке мы настроили ленивую инициализацию с помощью нового свойства spring.main.lazy-initialization, введенного в Spring Boot 2.2.

Как всегда, исходный код этого учебника доступен на GitHub .