「新特性」Spring Boot 全局懒加载机制了解一下

关于延迟加载

在 Spring 中,默认状况下全部定的 bean 及其依赖项目都是在应用启动时建立容器上下文是被初始化的。测试代码以下:java

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

启动应用日志:git

[           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 ''

如上日志: 在 Tomcat started 以前 DemoConfig bean 已经被初始化建立。github

通常状况程序在启动时时有大量的 Bean 须要初始化,例如 数据源初始化、缓存初始化等致使应用程序启动很是的慢。在 spring boot 2.2 以前的版本,咱们对这些 bean 使用手动增长 @Lazy 注解,来实现启动时不初始化,业务程序在调用须要时再去初始化,如上代码修改成便可:redis

@Lazy
@Configuration
public class DemoConfig {}

为何须要全局懒加载

同上文中提到咱们须要手动在 bean 增长 @Lazy 注解,这就意味着咱们仅能对程序中自行实现的 bean 进行添加。可是如今 spring boot 应用中引入了不少第三方 starter ,好比 druid-spring-boot-starter 数据源注入、spring-boot-starter-data-redis 缓存等默认状况下, 引入即注入了相关 bean 咱们没法去修改添加 @Lazyspring

  • spring boot 2.2 新增全局懒加载属性,开启后全局 bean 被设置为懒加载,须要时再去建立
spring:
  main:
    lazy-initialization: true  #默认false 关闭
  • 个别 bean 能够经过设置 @Lazy(false) 排除,设置为启动时加载
@Lazy(false)
@Configuration
public class DemoConfig {}
  • 固然也能够指定规则实现 LazyInitializationExcludeFilter 规则实现排除
@Bean
 LazyInitializationExcludeFilter integrationLazyInitExcludeFilter() {
    return LazyInitializationExcludeFilter.forBeanTypes(DemoConfig.class);
}

全局懒加载的问题

经过设置全局懒加载,咱们能够减小启动时的建立任务从而大幅度的缩减应用的启动时间。但全局懒加载的缺点能够概括为如下两点:缓存

  • Http 请求处理时间变长。 这里准确的来讲是第一次 http 请求处理的时间变长,以后的请求不受影响(说到这里天然而然的会联系到 spring cloud 启动后的第一次调用超时的问题)。
  • 错误不会在应用启动时抛出,不利于早发现、早解决、早下班。

总结

image

相关文章
相关标签/搜索