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

对于提早加载

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

如上日志: 在 Tomcat started 之前 DemoConfig bean 曾经被初始化创立。

个别状况程序在启动时时有大量的 Bean 须要初始化,例如 数据源初始化、缓存初始化等导致应用程序启动十分的慢。在 spring boot 2.2 之前的版本,咱们对这些 bean 应用手动减少 @Lazy 注解,来实现启动时不初始化,业务程序在调用须要时再去初始化,如上代码批改为即可:

@Lazy
@Configuration
public class DemoConfig {}

为什么须要全局懒加载

同上文中提到咱们须要手动在 bean 减少 @Lazy 注解,这就意味着咱们仅能对程序中自行实现的 bean 进行增加。然而当初 spring boot 利用中引入了很多第三方 starter ,比方 druid-spring-boot-starter 数据源注入、spring-boot-starter-data-redis 缓存等默认状况下, 引入即注入了相干 bean 咱们无奈去批改增加 @Lazy

  • 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 启动后的第一次调用超时的问题)。
  • 谬误不会在利用启动时抛出,不利于早发现、早解决、早上班。

总结

  • 以上源码: spring-boot-course

本文由乐趣区整理发布,转载请注明出处,谢谢。

You may also like...

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据