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. Эффекты ленивой инициализации
Включение ленивой инициализации во всем приложении может привести как к положительным, так и к отрицательным эффектам.
Давайте поговорим о некоторых из них, как они описаны в официальном анонсе нового функционала:
- Ленивая инициализация может уменьшить количество бобов, созданных при запуске приложения – следовательно, мы можем улучшить время запуска приложения
- Поскольку ни один из бобов не создается до тех пор, пока они не понадобятся, мы могли бы замаскировать проблемы, получив их во время выполнения, а не во время запуска
- Эти проблемы могут включать ошибки нехватки памяти, неправильные конфигурации или найденные ошибки определения класса
- Кроме того, когда мы находимся в веб – контексте, запуск создания боба по требованию увеличит задержку HTTP-запросов -создание боба повлияет только на первый запрос, но это может негативно повлиять на балансировку нагрузки и автоматическое масштабирование .
7. Заключение
В этом уроке мы настроили ленивую инициализацию с помощью нового свойства spring.main.lazy-initialization, введенного в Spring Boot 2.2.
Как всегда, исходный код этого учебника доступен на GitHub .