前几天栈长分享了一个好玩的框架:一个比Spring Boot快44倍的Java框架!,是不是感觉 Spring Boot 略慢?今天讲一下 Spring Boot 添加的这个新特性,可以大大提升 Spring Boot 的启动速度。

最近,Spring团队宣布在 Spring Boot 2.2+ 中添加了一个重要功能:延迟加载,目前这个版本暂时还是快照版,不过我们可以先了解下怎么使用这个延迟加载功能。

延迟加载是什么意思?

有点经验的程序员应该都知道,在 Spring 框架中早已经支持延迟加载功能的,简单来说就是一个类的实例化,不需要 Spring 容器启动的时候就开始实例化,而是在第一次需要它的时候再实例化,这样大大提升了程序启动速度,也在一定程序上节省了系统资源。

怎么开启延迟加载?

在传统 Spring 项目中我们是这么做的:

<bean id="testBean" calss="cn.javastack.TestBean" lazy-init="true" />

以上 bean 配置是不是很熟悉?

没错,加了 lazy-init="true" 表示延迟加载,默认不加为false,表示容器启动时立即加载。

在 Spring 3.0+ 之后也可以这么做:

@Lazy
public TestBean testBean() {
return new TestBean();
}

@Lazy:默认值为true,表示延迟加载;

Spring Boot如何开启?

由上面的例子我们可以知道,在任何 Spring Boot 版本中其实是支持 Bean 的延迟加载的,但这样是需要我们手工去配置的,这样会比较麻烦。

在 Spring Boot 2.2+ 中,延期加载将变得更加简单,有几下几种配置方式:

  • 参数:spring.main.lazy-initialization
  • 类:SpringApplication
  • 类:SpringApplicationBuilder

通过以上几种方式设置成:true,容器中的 Bean 就将配置成延迟加载。

Spring Boot 项目在 IDE 中再配合 DevTools 工具,可以使本发开发环境启动变得更快,400ms就可以启动起来了,大大提高了开发效率。

延迟加载有没有缺点?

延迟加载确实可以大大减少应用程序的启动时间,还能节省系统资源,那么问题来了,你可能会问,为什么不默认开启它呢?为什么还要额外提供一个配置?

听栈长道来,延迟加载确实有很多好处,但也会造成一些在启动的时候就能发现而要等到延迟加载才发现的问题,如:内存不足啊、类找不到啊、又或者是配置错误引发的系列问题。

还有一个问题就是,因为第一次请求的时候才去实例化,可能造成第一个请求变慢,响应延迟,体验不是很好。这样一来,对负载均衡和自动伸缩方面也会有不利影响。

结束语

正如我们在上面所分析到的,延迟加载确实可以显着改善启动时间,但也有一些明显的缺点,所以我们一定小心谨慎的启用它。或者我们可以对项目进行评估下,延迟加载真的对我们的项目有这么重要或者急迫么?

等正式版 Spring Boot 2.2 发布,栈长给再出一个实战文章,欢迎关注栈长的微信公众号:Java技术栈,不要走开。

好了,今天的分享就到这里,关注Java技术栈微信公众号,在后台回复:boot,获取栈长整理的更多的 Spring Boot 教程,都是实战干货,以下仅为部分预览。

  • Spring Boot 读取配置的几种方式
  • Spring Boot 如何做参数校验?
  • Spring Boot 最核心的 25 个注解!
  • Spring Boot 2.x 启动全过程源码分析
  • Spring Boot 2.x 新特性总结及迁移指南
  • ……

最后,你们是怎么应用延迟加载功能的,欢迎留言分享~

本文原创首发于微信公众号:Java技术栈(id:javastack),关注公众号在后台回复 "boot" 可获取更多 Spring Boot 教程,转载请原样保留本信息。

Spring Boot 2.2 增加了一个新功能,启动飞起~的更多相关文章

  1. spring boot开发,jar包一个一个来启动太麻烦了,写一个bat文件一键启动

    spring boot开发,jar包一个一个来启动太麻烦了,写一个bat文件一键启动 @echo offcd D:\workProject\bushustart cmd /c "title ...

  2. Android开发之清除缓存功能实现方法,可以集成在自己的app中,增加一个新功能。

    作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 Android开发之清除缓存功能实现方法,可以集成在自己的app中,增加一个新功能. 下面是一个效果图 ...

  3. Spring Boot 学习笔记1---初体验之3分钟启动你的Web应用

    前言 早在去年就简单的使用了一下Spring Boot,当时就被其便捷的功能所震惊.但是那是也没有深入的研究,随着其在业界被应用的越来越广泛,因此决定好好地深入学习一下,将自己的学习心得在此记录,本文 ...

  4. Spring Boot 2.X(十四):日志功能 Logback

    Logback 简介 Logback 是由 SLF4J 作者开发的新一代日志框架,用于替代 log4j. 主要特点是效率更高,架构设计够通用,适用于不同的环境. Logback 分为三个模块:logb ...

  5. PyCharm 2019.3发布,增加了哪些新功能呢?

    Python的IDE(Integrated Development Environment 集成开发环境)非常多,如:VS Code.Sublime.NotePad.Python自带编辑器IDLE.J ...

  6. 【spring cloud】子模块module -->导入一个新的spring boot项目作为spring cloud的一个子模块微服务,怎么做/或者 每次导入一个新的spring boot项目,IDEA不识别子module,启动类无法启动/右下角没有蓝色图标

    如题:导入一个新的spring boot项目作为spring cloud的一个子模块微服务,怎么做 或者说每次导入一个新的spring boot项目,IDEA不识别,启动类无法启动,怎么解决 下面分别 ...

  7. 初识Spring Boot框架(二)之DIY一个Spring Boot的自动配置

    在上篇博客初识Spring Boot框架中我们初步见识了SpringBoot的方便之处,很多小伙伴可能也会好奇这个Spring Boot是怎么实现自动配置的,那么今天我就带小伙伴我们自己来实现一个简单 ...

  8. 【spring Boot】1.创建第一个springBoot项目

    入手springBoot,搭建第一个springBoot项目. 看官方文档还是有点别扭. https://docs.spring.io/spring-boot/docs/current-SNAPSHO ...

  9. Spring Boot 《一》开发一个“HelloWorld”的 web 应用

    一,Spring Boot 介绍 Spring Boot不是一个新的框架,默认配置了多种框架使用方式,使用SpringBoot很容易创建一个独立运行(运行jar,内嵌Servlet).准生产级别的基于 ...

随机推荐

  1. mongoDB的安装及基本使用

    1.mongoDB简介 1.1 NoSQL数据库 数据库:进行高效的.有规则的进行数据持久化存储的软件 NoSQL数据库:Not only sql,指代非关系型数据库 优点:高可扩展性.分布式计算.低 ...

  2. IntelliJ IDEA 配置maven

    以下内容引自http://blog.csdn.net/qq_32588349/article/details/51461182. 使用IntelliJ IDEA 配置Maven(入门)         ...

  3. SQL2008全部数据导出导入两种方法

    方法一:生成脚本导出导入sql2008全部数据第一步,右键要导出的数据库,任务--生成脚本 第二步,在设置脚本编写选项处,点击--高级(A),选择要编写脚本的数据的类型为:架构和数据 如果找不到 要编 ...

  4. 用beego开发服务端应用

    用beego开发服务端应用 说明 Quick Start 安装 创建应用 编译运行 打包发布 代码生成 开发文档 目录结构说明 使用配置文件 beego默认参数 路由设置 路由的表述方式 直接设置路由 ...

  5. xsrftoken--源码笔记

    }

  6. 关于MySQL死锁

    最近项目中遇到一个问题,使用Spring事务嵌套时,导致MySQL死锁.记录一下,时刻提醒自己. 场景如下, 事务嵌套, 最外层有默认事务, 嵌套一个独立事务, 独立事务和外部事务同时操作一张表.

  7. C#和C++除了语法上的差别外,还有什么其他的区别

    C#与C++的区别: 1.C#有垃圾自动处理机制,所以程序员不用担心对象的内存的释放问题: 2.C#严禁使用指针,但是非要使用的话,只能在unsafe程序块中的使用: 3.C#只有单继承: 4.C#必 ...

  8. bzoj 1098 poi2007 办公楼 bfs+链表

    题意很好理解,求给出图反图的联通块个数. 考虑这样一个事情:一个联通块里的点,最多只会被遍历一次,再遍历时没有任何意义 所以用链表来存,每遍历到一个点就将该点删掉 #include<cstdio ...

  9. 从零开始学 Web 之 CSS(三)链接伪类、背景、行高、盒子模型、浮动

    大家好,这里是「 Daotin的梦呓 」从零开始学 Web 系列教程.此文首发于「 Daotin的梦呓 」公众号,欢迎大家订阅关注.在这里我会从 Web 前端零基础开始,一步步学习 Web 相关的知识 ...

  10. 如何将markdown转换为wxml

    话说我要为技术博客写一个小程序版,我的博客解决方案是 hexo + github-page,格式当然是技术控们喜欢的 markdown 了 .但小程序使用的却是独有的模版语言 WXML.我总不能把之前 ...