«Новая функция» Глобальный механизм ленивой загрузки Spring Boot для понимания

Spring Boot Java

О ленивой загрузке

В Spring по умолчанию все данные bean-компоненты и их зависимости создаются при запуске приложения и инициализации контекста контейнера. Код теста выглядит следующим образом:

@Slf4j
@Configuration
public class DemoConfig {
    public DemoConfig() {
        log.warn(" > > > demoConfig 被初始化 > > >");
    }
}

Запустите журнал приложений:

[           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
[           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1193 ms
[           main] c.p.c.global.lazy.config.DemoConfig      :  > > > demoConfig 被初始化 > > >
[           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
[           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''

Как в приведенном выше журнале: bean-компонент DemoConfig был инициализирован и создан до запуска Tomcat.

Как правило, при запуске программы необходимо инициализировать большое количество bean-компонентов, таких как инициализация источника данных, инициализация кэша и т. д., что приводит к очень медленному запуску приложения. В версиях до spring boot 2.2 мы использовали ручное увеличение для этих bean-компонентов."@Lazy"Аннотация, чтобы добиться отсутствия инициализации при запуске и инициализации бизнес-программы при необходимости Приведенный выше код можно изменить следующим образом:

@Lazy
@Configuration
public class DemoConfig {}

Зачем нужна глобальная ленивая загрузка

Как упоминалось выше, нам нужно вручную увеличить бин"@Lazy"Annotation, что означает, что мы можем добавлять только bean-компоненты, реализованные нами в программе. Но теперь приложения весенней загрузки представили множество сторонних стартеров, таких как внедрение источника данных druid-spring-boot-starter, кэширование spring-boot-starter-data-redis и т. д. По умолчанию введение будет внедрять связанные компоненты, и мы не может изменить их Добавить в"@Lazy".

  • Spring boot 2.2 добавляет новое глобальное свойство отложенной загрузки.После открытия глобальный компонент устанавливается на отложенную загрузку и создается при необходимости.
spring:
  main:
    lazy-initialization: true  #默认false 关闭
  • Отдельные бобы могут быть установлены"@Lazy(false)"Исключить, установить загрузку при запуске
@Lazy(false)
@Configuration
public class DemoConfig {}
  • Конечно, вы также можете указать правила для реализации правил LazyInitializationExcludeFilter для достижения исключения.
@Bean
 LazyInitializationExcludeFilter integrationLazyInitExcludeFilter() {
    return LazyInitializationExcludeFilter.forBeanTypes(DemoConfig.class);
}

Проблема глобальной ленивой загрузки

Установив глобальную ленивую загрузку, мы можем уменьшить количество задач создания при запуске и значительно сократить время запуска приложения. Но недостатки глобальной ленивой загрузки можно свести к следующим двум пунктам:

  • Время обработки HTTP-запроса увеличивается. Если быть точным, то время обработки первого http-запроса увеличивается, а последующие запросы не затрагиваются (речь об этом, естественно, будет связана с проблемой таймаута первого вызова после запуска весеннего облака).

  • Ошибки не будут возникать при запуске приложения, что не способствует раннему обнаружению, раннему разрешению и раннему завершению работы.

Суммировать