java 懒加载原理_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 启动后的第一次调用超时的问题)。
错误不会在应用启动时抛出,不利于早发现、早解决、早下班。
总结
到此这篇关于SpringBoot新特性之全局懒加载机制的文章就介绍到这了,更多相关SpringBoot 全局懒加载机制内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
java 懒加载原理_SpringBoot新特性之全局懒加载机制相关推荐
- Java 9 中的9个新特性
转载自 强悍!Java 9 中的9个新特性 你可能已经听说过 Java 9 的模块系统,但是这个新版本还有许多其它的更新. 这里有九个令人兴奋的新功能将与 Java 9 一起发布. Java 平台级模 ...
- Java 9 中的 9 个新特性
Java 9 中的 9 个新特性 Java 8 发布三年多之后,已经于在2017年9月21日发布了. 你可能已经听说过 Java 9 的模块系统,但是这个新版本还有许多其它的更新. 这里有九个令人兴奋 ...
- 深圳Java培训学习:Java8.0新特性之Lambda表达式--【千锋】
深圳Java培训学习:Java8.0新特性之Lambda表达式–[千锋] 前言 Java 8 已经发布很久了,很多报道表明Java 8 是一次重大的版本升级.本篇文章,主要给大家介绍的是lambda表 ...
- java 可控异常_java异常处理,重新认识java异常,java7异常处理的新特性!
原标题:java异常处理,重新认识java异常,java7异常处理的新特性! 在程序中,错误可能产生于程序员没有预料的各种情况,或者是超出了程序员可控范围的环境因素,如用户的坏数据.试图打开一个根本不 ...
- Java番外篇2——jdk8新特性
Java番外篇2--jdk8新特性 1.Lambda 1.1.无参无返回值 public class Test {interface Print{void print();}public static ...
- php tp5框架新特性面试,tp5完整加载执行流程——thinkphp5 框架
1,入口文件(tp5\public\index.php) 作用: 1)定义目录常量 2)加载框架引导目录 2.加载框架引导文件(tp5\thinkphp\start.php) 作用: 1)引导基础文件 ...
- Java 7~14各个版本新特性详解
Java 7 特性列表 switch中添加对String类型的支持 数字字面量的改进 / 数值可加下划 异常处理(捕获多个异常) try-with-resources 增强泛型推断 JSR203 NI ...
- 7.Java基础之集合框架+JDK8新特性
1.集合概述 1.1 为什么学集合 思考:数组有什么缺点? 长度一旦定义,不能改变!定义大了,浪费空间:小了,可能不够 ---->动态的数组 对于增删,需要移动位置 ->有人帮我们做这个事 ...
- Java 5~11各个版本新特性史上最全总结
Java 5 Java5开发代号为Tiger(老虎),于2004-09-30发行 特性列表 泛型 枚举 自动装箱拆箱 可变参数 注解 foreach循环(增强for.for/in) 静态导入 格式化( ...
最新文章
- 防抖技术 | OpenCV实现视频稳流
- python yield yield from
- 使用expect实现shell自动交互
- 【备忘录】Product cost collectors – 成本收集器
- (机器视觉)Halcon下颜色识别与联合C#编程
- for each....in、for in、for of
- CentOS命令行安装配置KVM详细教程
- linux按键检测程序,Tiny4412 Linux驱动之按键(使用查询方式) | 技术部落
- js ul 清缓存_JavaScript使用ul中li标签实现删除效果
- 防止自建控件与页面间重复引入客户端js脚本的方法
- 工作默认加班,不续签默认不加班
- csol永恒python怎样施展技能_Python3 基础语法
- visio用例图箭头怎么画_visio2010绘制用例图-带图例
- 【Windows 11】终端美化配置(优化)
- 使用matplotlib画3d平面风场_新篇章:12激光SLM金属3D打印机开卖,速度提升20倍,工业批量化生产新利器...
- 20200322零基础入门数据挖掘 - 二手车交易价格预测笔记(2)
- 常见的性能测试类型有那些?
- Warmup Learning
- android 读写cpu卡,RAM/CPU和SD卡读写性能提升_联想 K860i_手机Android频道-中关村在线...
- 关于c++取绝对值的方法
热门文章
- JazzyViewPager加FragmentTabHost实现多样式滑动App的基本布局
- VS·卸载进程卡死“正在配置您的系统,这可能需要一些时间“
- 花钱买闲鱼无货源课程?可能你的钱白花了,没你想象的那么复杂
- 常见排序算法之二分插入排序算法
- eclipse项目缺少必需的库_java – Eclipse / Maven Project缺少必需的库/缺失工件
- Backspace长按不能删除,按一下只能删除一个字符
- word从入门到精通2
- 登录(记住账号密码、获取后台数据)
- gitLab团队开发基本操作步骤
- 钱差点没了,京东莫名解绑手机号并注册,难道安卓手机中了木马?期待大神解释