我的编程空间,编程开发者的网络收藏夹
学习永远不晚

SpringBoot项目速度提升之延迟初始化(LazyInitialization)详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

SpringBoot项目速度提升之延迟初始化(LazyInitialization)详解

前言

在一个名为种花家的小镇上,生活着一群热爱编程的人。他们致力于构建出高效、可维护的软件系统,而 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 的定义
}

2.对于使用 Java 配置类的方式,可以在 @Bean 注解上使用 @Lazy 注解,以实现延迟初始化。

示例:

@Configuration
public class AppConfig {
    @Lazy
    @Bean
    public MyBean myBean() {
        // Bean 的定义
        return new MyBean();
    }
}

3.对于 XML 配置的 Bean,可以在 <bean> 元素上设置 lazy-init 属性为 true,以实现延迟初始化。

示例:

<bean id="myBean" class="com.example.MyBean" lazy-init="true" />

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

到此这篇关于SpringBoot项目速度提升之延迟初始化(Lazy Initialization)详解的文章就介绍到这了,更多相关SpringBoot延迟初始化内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

SpringBoot项目速度提升之延迟初始化(LazyInitialization)详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

SpringBoot项目速度提升之延迟初始化(LazyInitialization)详解

延迟初始化(Lazy Initialization)是一种在需要时才创建或加载对象的策略,以减少启动时间和资源消耗,本文就来讲讲延迟初始化的具体使用吧
2023-05-19

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录