SpringBoot新特性之全局懒加载机制

 更新时间:2020年07月16日 09:08:16   作者:冷冷zz  
这篇文章主要介绍了SpringBoot新特性之全局懒加载机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

关于延迟加载

在 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

到此这篇关于SpringBoot新特性之全局懒加载机制的文章就介绍到这了,更多相关SpringBoot 全局懒加载机制内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java实现自定义阻塞队列

    Java实现自定义阻塞队列

    这篇文章主要介绍了Java如何实现自定义阻塞队列,帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下
    2020-10-10
  • springboot中@Async默认线程池导致OOM问题

    springboot中@Async默认线程池导致OOM问题

    这篇文章主要介绍了springboot中@Async默认线程池导致OOM问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • Java中用户向系统传递参数的三种基本方式实例分享

    Java中用户向系统传递参数的三种基本方式实例分享

    这篇文章主要介绍了Java中用户向系统传递参数的三种基本方式实例,有需要的朋友可以参考一下
    2014-01-01
  • Java处理日期时间的方法汇总

    Java处理日期时间的方法汇总

    这篇文章主要给大家介绍了利用Java中的Calendar 类处理日期时间的方法汇总,其中包括取日期的每部分、取当月的第一天或最后一天、求两个日期之间相隔的天数以及一年前的日期等等的示例代码,有需要的朋友们可以直接参考借鉴,下面来一起看看吧。
    2016-12-12
  • Mybatis事务如何跟Spring结合(数据库事务特性和Spring事务管理源码)

    Mybatis事务如何跟Spring结合(数据库事务特性和Spring事务管理源码)

    MyBatis与Spring的事务结合主要是通过Spring的事务管理和MyBatis的数据库操作来实现的,在本文中,我们将从数据库事务特性和Spring事务管理源码两个角度来分析MyBatis事务如何与Spring结合到一起的原理,感兴趣的朋友一起看看吧
    2024-01-01
  • Java JDK 1.8 lambda的用法详解

    Java JDK 1.8 lambda的用法详解

    这篇文章主要介绍了Java JDK 1.8 lambda的用法详解,文中给大家提到了jdk 1.8 Lambda 表达式 遍历数组的方法,需要的朋友可以参考下
    2019-09-09
  • java连接SQL Server数据库的超详细教程

    java连接SQL Server数据库的超详细教程

    最近在java连接SQL数据库时会出现一些问题,所以这篇文章主要给大家介绍了关于java连接SQL Server数据库的超详细教程,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • Android中PreferenceFragment的使用详解

    Android中PreferenceFragment的使用详解

    本文主要介绍了Android中PreferenceFragment的使用详解,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • java Comparable和Comparator的区别及作用面试精讲

    java Comparable和Comparator的区别及作用面试精讲

    这篇文章主要为大家介绍了java Comparable和Comparator的区别及作用面试精讲,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • SpringBoot整合阿里云OSS对象存储服务的实现

    SpringBoot整合阿里云OSS对象存储服务的实现

    这篇文章主要介绍了SpringBoot整合阿里云OSS对象存储服务的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08

最新评论