【spring】@Lazy注解学习

news2024/12/26 23:11:20

@Lazy介绍

 @Lazy 注解是一个配置注解,用于指示 Spring 容器在创建 bean 时采用延迟初始化的策略。这意味着,除非 bean 被实际使用,否则不会被创建和初始化。

在 Spring 框架中,默认情况下,所有的单例 bean 在容器启动时都会被创建和初始化。但是,对于一些复杂的 bean,它们的初始化可能会比较耗时,或者它们依赖的资源在容器启动时可能还没有准备好。在这些情况下,使用 @Lazy 注解可以避免在容器启动时立即创建和初始化这些 bean,从而提高容器的启动速度,减少资源消耗。

@Lazy 注解可以应用于类级别,也可以应用于方法级别。当应用于类级别时,它指示 Spring 容器对该类创建的所有 bean 实例都采用延迟初始化策略。当应用于方法级别时,它指示 Spring 容器对该方法创建的 bean 实例采用延迟初始化策略。

需要注意的是,@Lazy 注解只对单例 bean 有效,对于原型 bean,由于每次获取 bean 时都会创建一个新的实例,因此不需要使用 @Lazy 注解。此外,如果一个 bean 依赖于其他 bean,并且这些依赖的 bean 没有被初始化,那么即使使用了 @Lazy 注解,Spring 容器也会在初始化该 bean 时创建和初始化这些依赖的 bean。

@Lazy源码

@Target({ElementType.TYPE, ElementType.METHOD, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Lazy {
	boolean value() default true;
}
源代码截图

@Lazy属性介绍

value:boolean类型的属性,表示是否延迟创建单例Bean,默认值为true。

  • true:表示延迟创建单例Bean,此时在IOC启动时不会创建Bean对象,而是在第一次使用时创建单例Bean对象。
  • false:表示不延迟创建单例Bean对象,IOC容器启动时,就会创建单例Bean对象。

@Lazy注解使用场景

使用场景主要集中在以下几种情况:

  1. 重量级 bean 的初始化:当你的应用中有一些初始化成本较高的 bean,例如需要连接到外部服务或加载大量数据的 bean 时,使用 @Lazy 可以推迟这些 bean 的初始化,直到它们真正被需要。

  2. 依赖关系中的循环依赖:在处理循环依赖时,@Lazy 可以帮助打破依赖关系,确保 bean 能够在需要时才被创建。这通常用于解决两个或多个 bean 相互依赖,但不需要在应用启动时立即完全初始化的情况。

  3. 按需加载服务:在某些情况下,你可能希望服务或组件仅在首次请求时初始化,例如,当服务的初始化过程涉及到昂贵的 I/O 操作或复杂的计算时。这样可以提高应用的响应速度和启动性能。

  4. 懒加载关联对象:在处理关联对象时,如果关联对象的初始化不是应用启动时必须的,可以使用 @Lazy 来延迟加载这些关联对象,直到它们被访问。

  5. 避免启动时的阻塞:如果某些 bean 的初始化过程可能会阻塞应用的启动(例如,等待外部资源就绪),使用 @Lazy 可以确保应用能够快速启动,而不会因为等待这些资源而延迟。

  6. 优化测试过程:在进行单元测试时,@Lazy 可以帮助减少测试环境的初始化时间,因为你可能不需要在测试时加载所有的 bean。

  7. 按需初始化的配置:有时候,你可能希望根据配置文件或环境变量来决定是否延迟加载某些 bean。在这种情况下,@Lazy 可以与条件化配置结合使用,以实现更灵活的初始化策略。

  8. 服务的预热:在某些应用中,可能需要在应用启动后进行一些预热操作,如缓存预热。@Lazy 可以用来延迟加载负责预热的服务,直到应用启动完成并且预热操作可以安全执行。

@Lazy测试示例代码

示例代码 一
LazyDemoBean类
package com.yang.SpringTest.annotation.lazyLearn;

import lombok.Data;
import lombok.extern.slf4j.Slf4j;

/**
 * @author By: chengxuyuanshitang
 * Package com.yang.SpringTest.annotation.lazyLearn
 * Ceate Time 2024-03-21 16:02
 */
@Data
@Slf4j
public class LazyDemoBean {
 public LazyDemoBean(){
     log.info (" ---------- LazyDemoBean Init ----------");
 }
}

LazyDemoConfig配资类
package com.yang.SpringTest.annotation.lazyLearn;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Lazy;

/**
 * <p>配置类</p>
 *
 * @author By: chengxuyuanshitang
 * Package com.yang.SpringTest.annotation.lazyLearn
 * Ceate Time 2024-03-21 16:07
 */
@Configuration
public class LazyDemoConfig {

    @Bean
    @Lazy
    public LazyDemoBean lazyDemoBean () {
        return new LazyDemoBean ();
    }
}

LazyDemoTest测试类
package com.yang.SpringTest.annotation.lazyLearn;

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

/**
 * <p>测试类</p>
 *
 * @author By: chengxuyuanshitang
 * Package com.yang.SpringTest.annotation.lazyLearn
 * Ceate Time 2024-03-21 16:08
 */
@Slf4j
public class LazyDemoTest {
    public static void main(String[] args) {
        log.info("========== 创建IOC容器开始==========");
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(LazyDemoConfig.class);
        log.info("==========创建IOC容器结束==========");

        log.info("==========IOC容器中获取Bean开始==========");
        LazyDemoBean demo1 = context.getBean(LazyDemoBean.class);
        LazyDemoBean demo2 = context.getBean(LazyDemoBean.class);
        log.info("**************** demo1是否等于demo2 : {}", (demo1 == demo2));
        log.info("==========从IOC容器中获取Bean结束==========");
        context.close();
    }
}

运行结果




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

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

相关文章

运用YOLOv5实时监测并预警行人社交距离违规情况

YOLO&#xff08;You Only Look Once&#xff09;作为一种先进的实时物体检测算法&#xff0c;在全球范围内因其高效的实时性能和较高的检测精度受到广泛关注。近年来&#xff0c;随着新冠疫情对社交距离管控的重要性日益凸显&#xff0c;研究人员开始将YOLO算法应用于社交距离…

关于Count,FPKM,TPM,RPKM等表达量的计算及转换 | 干货

原文链接:关于Count,FPKM,TPM,RPKM等表达量的计算及转换 | 干货 写在前面 今天使用count值转化TPM,或是使用FPKM转换成TPM。这样的教程,我们在前面已经出国一起相对比较详细的教程了,一文了解Count、FPKM、RPKM、TPM | 相互间的转化,在这个教程中,我们也归纳了各个数…

【力扣hot100】128.最长连续序列

给定一个未排序的整数数组 nums &#xff0c;找出数字连续的最长序列&#xff08;不要求序列元素在原数组中连续&#xff09;的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1&#xff1a; 输入&#xff1a;nums [100,4,200,1,3,2] 输出&#xff1a;4 解…

DMA的定义和作用

在计算机系统中&#xff0c;DMA&#xff08;Direct Memory Access&#xff0c;直接内存访问&#xff09;是一种用于提高数据传输效率的重要技术。本文将介绍DMA的定义、原理和作用&#xff0c;以及它在计算机系统中的重要性。 以下是我整理的关于嵌入式开发的一些入门级资料&a…

app开发中HBuilderX运行模拟器 配置模拟器手册

1.首先打开HBuilder 然后点击,左上角运行 2.点击运行到手机或模拟器内的ADB路径设置(A) 3. adb配置你模拟器的 adb.exe路径端口号配置你模拟器的端口号 我这里使用的逍遥模拟器所以 | 21503 端口 | 手机模拟器名称21503 端口逍遥模拟器21503夜神模拟器62001网易mumu模拟器7…

点餐小程序php毕设项目

主要技术框架&#xff1a; 主要功能模块&#xff1a; 商品管理 订单管理 用户管理 优惠券管理 商品分类管理 评论管理 轮播图管理 截图 获取源码 https://blog.lusz.top/article?article_id-2

Talk|Mila研究所蒙特利尔大学刘圳:三维表征和三维网格的重建与生成

本期为TechBeat人工智能社区第580期线上Talk。 北京时间3月21日(周四)20:00&#xff0c;Mila研究所&蒙特利尔大学博士生—刘圳的Talk已经准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “三维表征和三维网格的重建与生成”&#xff0c;向大家系统地介…

【软考】生成树

目录 1. 概念2. 图解3. 例题3.1 例题1 1. 概念 1.对于有n个顶点的连通图&#xff0c;至少有n-1条边&#xff0c;而生成树中恰好有n-1条边2.连通图的生成树是该图的极小连通子图3.若在图的生成树中任意加一条边&#xff0c;则必然形成回路4.图的生成树不是唯一的5.从不同的顶点…

GPU云服务器的优势和应用

GPU即图形处理器&#xff0c;是一种高性能计算加速器&#xff0c;主要用于处理复杂的图像、视频等。GPU云服务器&#xff0c;指的是在云计算环境下&#xff0c;通过云平台提供GPU计算能力的虚拟服务器。随着科技的迅猛发展&#xff0c;科技领域对其的讨论和应用也日益热烈、广泛…

ios symbolicatecrash 符号化crash

一、准备 1.1 .crash 文件获取 设备连接电脑打开XCode, 依次 XCode -> Windows -> Device and Simulator -> View Device Logs找到 (对应app名+时间点) -> 右键 Export Log1.2 .dSYM 和 .app 文件获取 .dSYM是十六进制函数地址映射信息的中转文件,调试的symbols…

【Leetcode】top 100 链表

基础知识补充 单向链表结构&#xff1a;item存储数据 next指向下一结点地址 head保存首地址 class Node(object): # 创建结点def __init__(self, item): self.item item # item存放数据元素self.next None # next是下一个…

人才测评三要素:需求、量表和在线工具

人才测评在企业招聘&#xff0c;和企业内部测评&#xff0c;团队优化&#xff0c;团队建设&#xff0c;晋升考评中存在大量的普遍的应用&#xff0c;对于公司财力足够的情况&#xff0c;完全可以把人才测评的活外包给专业的测评机构&#xff0c;而对于大量的中小企业来说&#…

MyBatis3源码深度解析(十九)MyBatis日志实现

文章目录 前言第七章 MyBatis日志实现7.1 Java日志体系7.1.1 常用日志框架7.1.2 Java日志发展史7.1.3 日志接口与日志实现的绑定 7.2 MyBatis日志实现7.2.1 Log接口7.2.2 LogFactory工厂7.2.3 MyBatis日志自动查找7.2.4 MyBatis日志类型配置 7.3 小结 前言 日志是Java应用中必…

VSCode创建用户代码片段-案例demo

示例 - 在线生成代码片段 Vue3代码片段 {"vue3": {scope": "javascript,typescript,html,vue","prefix": "vue3","body": ["<template>","$1","</template>",""…

基于 SemiDrive E3640 Gateway SSDK3.0 Sent 测试

一、 前言 SENT 全称&#xff1a;Single Edge Nibble Transmission&#xff0c;中文名称为&#xff1a;单边半字传输协议&#xff0c;是 SAE 推出的一种点对点的、单向传输的方案&#xff0c;被用于车载传感器和电子控制单元&#xff08;ECU&#xff09;之间的数据传输。SENT(S…

SSC9211_USB-CAM解决方案

一、方案描述 SSC9211是一种用于USB-CAM应用程序跟场景的高度集成的SOC产品。平台本身基于ARM层-A7双核&#xff0c;内置16位&#xff0c;64M的DDR2&#xff0c;集成了图像传感器接口、高级ISP、高性能JPEG编码器和其他丰富的外设接口。支持单&#xff0c;双 MIPI sensor方案&…

阻塞赋值与非阻塞赋值

1.原理 一个寄存器可以实现延迟一拍的效果。 可以看出输出out和中间寄存器in_reg确实 和输入in相差一拍&#xff0c;也就是一个时钟周期。 而out和in_reg没有延迟一拍是因为使用的是阻塞赋值。右边发生变化&#xff0c;左边立刻变化。 使用非阻塞赋值。 可以看到中间变量In_r…

安卓使用MQTT实现阿里云物联网云台订阅和发布主题(3)

一、订阅主题代码讲解 private final String mqtt_sub_topic "/sys/k0wih08FdYq/LHAPP/thing/service/property/set";//订阅话题//mqtt客户端订阅主题//QoS0时&#xff0c;报文最多发送一次&#xff0c;有可能丢失//QoS1时&#xff0c;报文至少发送一次&#xff0c…

ARM Coresight 系列文章 11.1 -- CoreSight Cortex-M33 CTI 详细介绍】

请阅读【ARM Coresight SoC-400/SoC-600 专栏导读】 文章目录 CTI 的工作原理CTI 主要特点CTI的使用场景CTI 的工作原理 CTI 允许不同的调试和追踪组件之间基于特定事件进行交互。例如,当一个断点被命中时,CTI 可以用来触发内存的追踪捕捉或者外部仪器的行为,反之亦然。这种…

【理解机器学习算法】之Clustering算法(Agglomerative Clustering)

聚合聚类(Agglomerative Clustering)是一种层次聚类算法&#xff0c;通过逐步合并或“聚集”它们来构建嵌套聚类。这种方法采用自底向上的方式构建聚类层次&#xff1a;它从将每个数据点作为单个聚类开始&#xff0c;然后迭代合并最接近的聚类对&#xff0c;直到所有数据点合并…