关于延迟加载

在 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 启动后的第一次调用超时的问题)。

错误不会在应用启动时抛出,不利于早发现、早解决、早下班。

总结

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

java 懒加载原理_SpringBoot新特性之全局懒加载机制相关推荐

  1. Java 9 中的9个新特性

    转载自 强悍!Java 9 中的9个新特性 你可能已经听说过 Java 9 的模块系统,但是这个新版本还有许多其它的更新. 这里有九个令人兴奋的新功能将与 Java 9 一起发布. Java 平台级模 ...

  2. Java 9 中的 9 个新特性

    Java 9 中的 9 个新特性 Java 8 发布三年多之后,已经于在2017年9月21日发布了. 你可能已经听说过 Java 9 的模块系统,但是这个新版本还有许多其它的更新. 这里有九个令人兴奋 ...

  3. 深圳Java培训学习:Java8.0新特性之Lambda表达式--【千锋】

    深圳Java培训学习:Java8.0新特性之Lambda表达式–[千锋] 前言 Java 8 已经发布很久了,很多报道表明Java 8 是一次重大的版本升级.本篇文章,主要给大家介绍的是lambda表 ...

  4. java 可控异常_java异常处理,重新认识java异常,java7异常处理的新特性!

    原标题:java异常处理,重新认识java异常,java7异常处理的新特性! 在程序中,错误可能产生于程序员没有预料的各种情况,或者是超出了程序员可控范围的环境因素,如用户的坏数据.试图打开一个根本不 ...

  5. Java番外篇2——jdk8新特性

    Java番外篇2--jdk8新特性 1.Lambda 1.1.无参无返回值 public class Test {interface Print{void print();}public static ...

  6. php tp5框架新特性面试,tp5完整加载执行流程——thinkphp5 框架

    1,入口文件(tp5\public\index.php) 作用: 1)定义目录常量 2)加载框架引导目录 2.加载框架引导文件(tp5\thinkphp\start.php) 作用: 1)引导基础文件 ...

  7. Java 7~14各个版本新特性详解

    Java 7 特性列表 switch中添加对String类型的支持 数字字面量的改进 / 数值可加下划 异常处理(捕获多个异常) try-with-resources 增强泛型推断 JSR203 NI ...

  8. 7.Java基础之集合框架+JDK8新特性

    1.集合概述 1.1 为什么学集合 思考:数组有什么缺点? 长度一旦定义,不能改变!定义大了,浪费空间:小了,可能不够 ---->动态的数组 对于增删,需要移动位置 ->有人帮我们做这个事 ...

  9. Java 5~11各个版本新特性史上最全总结

    Java 5 Java5开发代号为Tiger(老虎),于2004-09-30发行 特性列表 泛型 枚举 自动装箱拆箱 可变参数 注解 foreach循环(增强for.for/in) 静态导入 格式化( ...

最新文章

  1. 一份面向工程师的Google面试指南!GitHub 9.8万星高赞,中文版发布
  2. Android MVC,MVP,MVVM模式入门——重构登陆注册功能
  3. [转载]读史记札记23:并不是每次跌倒都能够重新站起来
  4. Java Review - 并发编程_DelayQueue原理源码剖析
  5. ServletContext2
  6. 我的2018年度总结
  7. Zookeeper Learning
  8. java面试题37 关于对象成员占用内存的说法哪个正确?( )
  9. 一个二维码不同手机扫描下载时跳转问题
  10. php atlas,Apache Atlas是什么意思
  11. 天堂2 服务器修改,服务器技术交流_新天堂2-战乱的序幕架设教程_-921根据地_只做有质量的游戏 - Powered by Discuz!...
  12. 《Machine Learning in Action》—— 剖析支持向量机,单手狂撕线性SVM
  13. 实验数据处理的基本方法
  14. # IE浏览器打不开网页,google浏览器能打开
  15. 做自媒体短视频是如何赚钱的呢?
  16. flash游戏教程集锦~~
  17. 有n个结构体变量,内含学生学号、姓名、3门课程的成绩,要求输出平均成绩最高的学生信息
  18. Hadoop配置总结(重置细节版)
  19. [经验分享] 覃超直播课-入职新公司后,如何快速斩头露角
  20. EasyPR--开发详解(5)颜色定位与偏斜扭转

热门文章

  1. 怎么建立局域网_小米频频发布新机 老手机应用文件怎么转移才够快?
  2. 闲鱼卖货,价格有优势才能赚钱吗?
  3. NDK JNI JavaVM、JNIEnv和jobject的理解
  4. 基于STM32和GPS-NEO-6M模块实现GPS导航定位的
  5. AutoCAD可以设计电路吗?
  6. “神奇“的表插入排序算法
  7. 5个简单小技巧为16G的iPhone“扩容”
  8. Java基于Socket实现聊天、群聊、敏感词汇过滤功能
  9. 鼠标和键盘是计算机两个最基本输入设备,【系列报道】菜鸟买品牌机之鼠标键盘篇...
  10. 【CPLEX教程02】配置Cplex的Java环境以及API说明