给你的项目启动提提速:Lazy Initialization

news2024/9/22 19:35:01

前言

  在一个名为种花家的小镇上,生活着一群热爱编程的人。他们致力于构建出高效、可维护的软件系统,而 Spring Boot 框架成为了他们的不二之选。这个小镇上的人们每天都在用 Spring Boot 框架创造着令人瞩目的应用程序。

  然而,随着时间的推移,他们的应用程序变得越来越庞大,包含了许多不同的模块和组件。在应用程序启动的时候,所有的 bean 都会被一次性初始化,这导致了一个令人头疼的问题:启动时间变得越来越长了。

  小镇的居民们开始感到困扰。他们意识到,无论是在开发环境还是在生产环境中,启动时间的长短都直接关系到他们的工作效率和用户体验。于是,他们寻找一种解决方案,希望能够在保证应用程序正常运行的同时,减少启动时间的开销。

  正当大家纠结不已时,一个编程少侠出现了。他名叫不一样的科技宅,他告诉大家,有一种叫做"延迟初始化"的策略,可以帮助他们解决这个问题。

  据说,延迟初始化能够将 bean 的初始化推迟到第一次使用时进行,而不是在应用程序启动时立即初始化。这样一来,只有当某个 bean 真正被需要时,才会进行初始化,避免了不必要的资源消耗和时间开销。

是什么?

  延迟初始化(Lazy Initialization)是一种在需要时才创建或加载对象的策略,以减少启动时间和资源消耗。在 Spring 中,延迟初始化允许将 Bean 的创建推迟到第一次访问该 Bean 时才进行,而不是在应用程序启动时立即创建。

有啥用?

节省资源

  当应用程序中存在大量的 bean 时,立即初始化所有 bean 可能会占用大量的内存和处理时间。通过延迟初始化,只有在需要使用 bean 时才会进行初始化,可以避免不必要的资源消耗。

加快启动时间

  延迟初始化可以减少应用程序启动时间,因为只有在需要时才会加载和初始化 bean。对于那些在应用程序启动时可能不会使用的较大或复杂的 bean,延迟初始化可以显著加快启动时间。

解决循环依赖

  Spring 容器可以管理 bean 之间的依赖关系。当存在循环依赖时,延迟初始化可以帮助解决这个问题。通过延迟初始化,Spring 容器可以在运行时逐个解析和满足 bean 之间的依赖,而不是在初始化阶段发现无法解决的循环依赖。

如何实现?

Spring Boot 中实现延迟初始化 Bean,可以采取以下四种方法:

  1. 对于使用注解配置的 Bean,可以在 Bean 的定义上使用 @Lazy 注解来实现延迟初始化。

示例:

@Lazy
@Component
public class MyBean {
    // Bean 的定义
}
  1. 对于使用 Java 配置类的方式,可以在 @Bean 注解上使用 @Lazy 注解,以实现延迟初始化。

示例:

@Configuration
public class AppConfig {
    @Lazy
    @Bean
    public MyBean myBean() {
        // Bean 的定义
        return new MyBean();
    }
}
  1. 对于 XML 配置的 Bean,可以在 <bean> 元素上设置 lazy-init 属性为 true,以实现延迟初始化。

示例:

<bean id="myBean" class="com.example.MyBean" lazy-init="true" />
  1. 对于使用@ComponentScan注解,可以配置属性lazyInit = true 实现某些包下面所有的 bean 延迟初始化。

示例:

package com.example.demo.bean;

import org.springframework.stereotype.Component;

@Component
public class MyBean {

    public MyBean() {
        System.out.println("My bean init success.");
    }
}

@SpringBootApplication
@ComponentScan(value = "com.example.demo.bean", lazyInit = true)
public class DemoApplication {

	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
	}

}

全局懒加载

  上面演示案例,意味着我们只能对自己实现的 bean 进配置。但是项目中肯定会引入很多第三方的 starter,比如 redis,mq。如果想对引入的第三方库进行配置,那就不太容易了,所以我们可以开启全局懒加载。

配置文件增加下面的配置:

spring:
  main:
    lazy-initialization: true  #默认false 关闭

开启了全局懒加载,想要过滤某个 bean,可以通过设置 @Lazy(false) 排除。

@Component
@Lazy(false)
public class MyBean {

    public MyBean() {
        System.out.println("My bean init success.");
    }
}

还有一种是通过配置 LazyInitializationExcludeFilter 规则实现排除。

@Configuration
public class AppConfig {

    @Bean
    LazyInitializationExcludeFilter integrationLazyInitExcludeFilter() {
        return LazyInitializationExcludeFilter.forBeanTypes(MyBean.class);
    }
}

注意的点

@Lazy 注解的使用

  要确保在正确的位置使用@Lazy 注解。通常情况下,将其添加在 Bean 的定义上,例如@Component、@Service、@Repository 等注解上。这样可以确保被标记的 Bean 在第一次使用时才会进行初始化。

依赖关系的处理

  懒加载的 Bean 可能会被其他 Bean 所依赖。在处理依赖关系时,要确保依赖的 Bean 已经被初始化或者也进行了懒加载。否则,可能会导致依赖注入失败或出现异常。

延迟初始化带来的影响

  懒加载虽然可以提高应用的启动性能,但也会带来一些影响。由于 Bean 的初始化被延迟到第一次使用,因此在初始化时可能会出现较长的延迟,对于需要立即使用的 Bean 可能会造成一定的等待时间。

内存消耗的控制

  懒加载虽然可以减少应用启动时的内存消耗,但也需要注意对内存的控制。如果应用中存在大量的懒加载 Bean,并且这些 Bean 在实际使用中并不频繁,可能会导致过多的内存占用。因此,需要根据应用的具体情况,合理使用懒加载,避免过度消耗内存。

运行时异常的处理

  由于懒加载将 Bean 的初始化延迟到运行时,因此在初始化过程中可能会发生异常。要确保适当地处理这些异常,以防止应用的崩溃或不可预料的行为。

总结

  懒加载是一种延迟加载的技术,用于在需要时才加载资源,而不是在应用启动时加载所有资源。在 Spring Boot 框架中,有两种方式可以实现懒加载:Spring 懒加载和全局懒加载。无论是懒加载还是全局懒加载,它们都能提升应用的性能和效率,避免不必要的资源加载。

  在使用 Spring 懒加载需要注意正确的注解使用、处理依赖关系、延迟初始化带来的影响、内存消耗控制和异常处理等方面。合理地使用可以提高应用性能,但也需要综合考虑应用的需求和场景,以确保有效性和稳定性。

结尾

  如果觉得对你有帮助,可以多多评论,多多点赞哦,也可以到我的主页看看,说不定有你喜欢的文章,也可以随手点个关注哦,谢谢。

  我是不一样的科技宅,每天进步一点点,体验不一样的生活。我们下期见!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/511078.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java 学习之线程

1、引入线程的优点&#xff1a; 1&#xff09;充分利用cup资源 2&#xff09;简化编程模型 3&#xff09;简化异步事件处理 4&#xff09;使GUI更有效率 5&#xff09;节约成本 2、线程使用&#xff1a;在Java中创建线程有几种方法&#xff0c;每个Java程序至少包含一个线…

软件工程开发文档写作教程(05)—可行性研究报告写作规范

本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl本文参考资料&#xff1a;电子工业出版社《软件文档写作教程》 马平&#xff0c;黄冬梅编著 软件工程开发文档现状 一个软件项目从立项到结尾共有几个阶段&#xff1a;立项&#xff0c;…

动画图解常见串行通讯协议:SPI、I²C、UART、红外分析

一、SPI传输 图1&#xff1a;SPI 数据传输 图1.2&#xff1a;SPI数据传输&#xff08;2&#xff09; ​ 图1.3&#xff1a; SPI时序信号 二、IC传输 图1.2.1&#xff1a; I2C总线以及寻址方式 三、UART传输 图1.3.1&#xff1a;PC 上通过UART来调试MCU 图1.3.2&#xff1a;R…

深入探究语音识别技术:原理、应用与实现

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

Qt-AES加密库

Qt-AES加密库 AES在线加解密工具[1] Qt-AES加密库[2] Qt AES/DES加密算法库 软件/文件/任意长度字符串加密 试用期许可使用方法软件试用期算法对称加密和非对称加密非对称加密&#xff08;Asymmetric Cryptography&#xff09;实例总结加密算法 [3] Qt笔记-AES加密[4] AES 加密…

【Betternet怎么用呢?】Betternet下载使用完整教程

Betternet是一款非常历史悠久的访问世界互联网行业的工具了。知道Betternet的用户&#xff0c;也应该是比较久的互联网用户了。早在2015年左右&#xff0c;那时候的betternet就是很多外贸行业的朋友上gmail以及Facebook上开发客户必备的工具了。 因为那时候betternet使用简单&…

Pandas + ChatGPT 超强组合,pandas-ai :交互式数据分析和处理新方法

Python Pandas是一个为Python编程提供数据操作和分析功能的开源工具包。这个库已经成为数据科学家和分析师的必备工具。它提供了一种有效的方法来管理结构化数据(Series和DataFrame)。 在人工智能领域&#xff0c;Pandas经常用于机器学习和深度学习过程的预处理步骤。Pandas通过…

第7章链接:静态链接、符号表、符号解析

文章目录 7.2 静态连接7.3 目标文件7.4 可重定位目标文件7.5 符号和符号表7.6 符号解析7.6.1 链接器如何解析多处定义的全局符号7.6.2 与静态库链接7.6.3 链接器如何使用静态库来解析引用 7.2 静态连接 像 Unix ld 程序这样的静态链接器&#xff08;static linker&#xff09;…

C语言函数大全-- u 开头的函数

C语言函数大全 本篇介绍C语言函数大全-- u 开头的函数 1. ultoa 1.1 函数说明 函数声明函数功能char *ultoa(unsigned long value, char *str, int base);用于将无符号长整型数转换成指定基数下的字符串表示 参数&#xff1a; value &#xff1a; 要转换的无符号长整型数st…

docker容器无法执行vim【已解决】

docker容器无法执行vim【已解决】 docker容器中执行vim失败安装文件没更换之前&#xff0c;速度非常的慢【失败】这里我更换了163的但是报错【失败】这里我更换了阿里的第一种报错【成功】&#xff1a;&#xff1a;&#xff1a;&#xff1a;这里我更换了阿里的第二种成功 完整步…

struct模块进行数据打包

原理&#xff1a; 将一组简单数据进行打包&#xff0c;转换为bytes格式发送。或者将一组bytes格式数据&#xff0c;进行解析。 接口使用 Struct(fmt) 功能: 生成结构化对象 参数&#xff1a;fmt 定制的数据结构 st.pack(v1,v2,v3…) 功能: 将一组数据按照指定格式打包转换为by…

分子动力学基础知识

分子动力学基础知识 目前主要存在两种基本模型&#xff1a;其一为量子统计力学, 其二为经典统计力学。 量子统计力学 基于量子力学原理, 适用 于微观的, 小尺度, 短时 间的模拟&#xff0c;可以描述电子 的结构分布&#xff0c;原子间的成 键断键等化学性质。 经典纭计力学…

MySQL原理(七):内存管理和磁盘管理

前言 上一篇介绍了 MySQL 的日志&#xff0c;这一篇将介绍内存管理和磁盘管理相关的内容。 内存管理 MySQL 的数据都是存在磁盘中的&#xff0c;我们要更新一条记录的时候&#xff0c;得先要从磁盘读取该记录&#xff0c;然后在内存中修改这条记录。修改完这条记录后会缓存起…

15 KVM虚拟机配置-体系架构相关配置

文章目录 15 KVM虚拟机配置-体系架构相关配置15.1 概述15.2 元素介绍15.3 AArch64架构配置示例15.4 x86_64架构配置示例 15 KVM虚拟机配置-体系架构相关配置 15.1 概述 XML中还有一部分体系架构相关的配置&#xff0c;这部分配置包括主板&#xff0c;CPU&#xff0c;一些与体…

【2023/05/10】Mitchel Resnick

Hello&#xff01;大家好&#xff0c;我是霜淮子&#xff0c;2023倒计时第5天。 Share Her wistful face haunts my dreams like the rain at night. 译文&#xff1a; 她的热切的脸&#xff0c;如夜雨似的&#xff0c;搅扰着我的梦魂。 Once we dreamt that we were stra…

论文解读:DELPHI:用于蛋白质相互作用位点预测的精确深度集成模型

期刊&#xff1a; Briefings in Bioinformatics 出版日期 2022-11-22 websever:https://iasri-sg.icar.gov.in/pldbpred/ 网址&#xff1a; PlDBPred: a novel computational model for discovery of DNA binding proteins in plants | Briefings in Bioinformatics | Oxfo…

递归到动态规划- X-空间压缩技巧

空间压缩技巧的示例代码代码&#xff0c; LeetCode第64题 验证链接&#xff1a;力扣 package dataStructure.recurrence.practice;/*** https://leetcode.cn/problems/minimum-path-sum/* Leecode第64题* 给定一个包含非负整数的 m x n 网格 grid &#xff0c;请找出一条从左…

C++好难(6):模板初阶

【本节目标】 1. 泛型编程2. 函数模板3. 类模板 目录 【本节目标】 1.泛型编程 2.函数模板 概念&#xff1a; 格式&#xff1a; 原理&#xff1a; 实例化&#xff1a; 1.隐式实例化&#xff1a; 2.显式实例化 原则一&#xff1a; 原则二&#xff1a; 原则三&#…

数组存储与指针学习笔记(三)指针与数组

嵌入式C语言学习进阶系列文章 GUN C编译器拓展语法学习笔记(一&#xff09;GNU C特殊语法部分详解 GUN C编译器拓展语法学习笔记(二&#xff09;属性声明 GUN C编译器拓展语法学习笔记(三&#xff09;内联函数、内建函数与可变参数宏 数组存储与指针学习笔记(一&#xff09;数…

OpenCv更改颜色空间以及图像阈值

本文主要讲解以下几个方面: 如何将图片从一个颜色空间转换到另一个&#xff0c;例如 BGR 到 Gray&#xff0c;BGR 到 HSV 等。简单阈值法另外&#xff0c;我们会创建一个从图片中提取彩色对象的应用。 1.改变颜色空间 cv.cvtColor(img, flag) 参数flag表示颜色空间转换的方…