【spring】@Lazy注解学习

@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@Lazypublic 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.mzph.cn/news/768070.shtml

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

相关文章

【Linux】模拟实现shell(bash)

目录 常见的与shell互动场景 实现代码 全部代码 homepath()接口 const char *getUsername()接口 const char *getHostname()接口 const char *getCwd()接口 int getUserCommand(char *command, int num)接口 void commandSplit(char *in, char *out[])接口 int execut…

aurora仿真使用等

IP设置 代码 aurora_8b10b aurora_8b10b_inst (/**********************************************************************************///axi_stream tx.s_axi_tx_tdata(s_axi_tx_tdata), // input wire [0 : 31] s_axi_tx_tdata.s_axi_tx_tkeep(s_axi_tx_…

2024开年首展,加速科技展台“热辣滚烫”

3月20日&#xff0c;备受瞩目的半导体行业盛会SEMICON China 2024在上海新国际博览中心盛大启幕&#xff0c;展会汇集了来自全球的半导体领域顶尖企业与专业人士。加速科技作为业界领先的半导体测试设备供应商携重磅测试设备及解决方案精彩亮相&#xff0c;展示了最新的半导体测…

KIMI爆了!对比文心一言和通义千问它到底有多强?

原文:赵侠客 前言 最近国产大模型KIMI爆了大部分人应该都知道了&#xff0c;从我个人的感受来看这次KIMI爆了我不是从技术领域接触到的&#xff0c;而是从各种金融领域接触到的。目前国内大模型可以说是百模大战&#xff0c;前几年新能源大战&#xff0c;今年资本割完韭菜后留…

Linux:Prometheus的源码包安装及操作(2)

环境介绍 三台centos 7系统&#xff0c;运行内存都2G 1.prometheus监控服务器&#xff1a;192.168.6.1 主机名&#xff1a;pm 2.grafana展示服务器:192.168.6.2 主机名&#xff1a;gr 3.被监控服务器&#xff1a;192.168.6.3 …

codeTop102:二叉树的层序遍历

前言 在已知BFS的方式后&#xff0c;知道每次从队列中取一个节点&#xff0c;就要将这个节点的所有子节点按照顺序放入队列。 难点在于怎么确定将同一层的节点放在一个数组里面的输出&#xff0c;也就是输出一个二维数组&#xff1f; 解决方法: 每次while循环将队列上轮放入的…

Vue2(十):全局事件总线、消息订阅与发布、TodoList的编辑功能、$nextTick、动画

一、全局事件总线&#xff01;&#xff01; 任意组件间通信 比如a想收到别的组件的数据&#xff0c;那么就在a里面给x绑定一个demo自定义事件&#xff0c;所以a里面就得有一个回调函数吧&#xff0c;然后我要是想让d组件给a穿数据&#xff0c;那就让d去触发x的自定义事件&…

洛谷_P2678 [NOIP2015 提高组] 跳石头_python写法

P2678 [NOIP2015 提高组] 跳石头 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) d, n, m map(int,input().split())data [0] for i in range(n):value int(input())data.append(value) data.append(d)def check(mid):now 0cnt 0for i in range(1,n2):if abs(data[now]-da…

机器学习(27)

文章目录 文献阅读1. 题目2. abstract3. 网络架构3.1 Theoretical Results 4. 文献解读4.1 Introduction4.2 创新点4.3 实验过程4.3.1 数据集4.3.2 参数设置 4.4 结论 三、实现GAN1. 任务要求2. 实验结果3.实验代码3.1数据准备3.2 模型构建3.3 展示函数3.4 训练过程 小结本周内…

从0写一个问卷调查APP的第13天-1

1.今日任务 我也只是一个大学生&#xff0c;有什么思路不对的地方给我指出来哟! 分析&#xff1a;上次我们实现了任务调查的插入。但是我们插入的问卷调查只有它的标题&#xff0c;也就是这个问卷调查是什么我们告诉数据库了&#xff0c;但是现在我们还没有给它添加任何问题&…

蓝桥杯真题:幸运数字

这道题可以用 integer.string&#xff08;&#xff09;求每个进制的数&#xff0c;但这里要每一位数相加&#xff0c;所以用这个方法会比较麻烦&#xff0c;如下 import java.util.Scanner; public class Main {public static void main(String[] args) {Scanner scan new Sc…

华为OD机试真题-推荐多样性-2024年OD统一考试(C卷)

题目描述: 推荐多样性需要从多个列表中选择元素,一次性要返回N屏数据(窗口数量),每屏展示K个元素(窗口大小),选择策略: 1. 各个列表元素需要做穿插处理,即先从第一个列表中为每屏选择一个元素,再从第二个列表中为每屏选择一个元素,依次类推 2. 每个列表的元素尽量均…

spring注解驱动系列--AOP探究二

上篇中记录了AnnotationAwareAspectJAutoProxyCreator的创建以及注册&#xff0c;主要是 1、EnableAspectJAutoProxy 注解会开启AOP功能 2、然后这个注解会往容器中注册一个AnnotationAwareAspectJAutoProxyCreator组件。 3、之后在容器创建过程中&#xff0c;注册后置处理器&a…

关于四篇GNN论文的阅读笔记PPT:包括GATNE,AM-GCN,HGSL和coGSL

关于四篇GNN论文的阅读笔记PPT&#xff1a;包括GATNE&#xff0c;AM-GCN&#xff0c;HGSL和coGSL 前言GATNEAM-GCNHGSLcoGSL 前言 这里的PPT主要是在跟Graph Transformer一起的&#xff1a; 【图-注意力笔记&#xff0c;篇章1】Graph Transformer&#xff1a;包括Graph Trans…

mysql基础3索引

存储引擎 存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式 。存储引擎是基于表的&#xff0c;而不是 基于库的&#xff0c;所以存储引擎也可被称为表类型。 1). 建表时指定存储引擎 CREATE TABLE 表名(字段1 字段1类型 [ COMMENT 字段1注释 ] ,......字段n…

JAVA的学习日记DAY4

算术运算符 关系运算符&#xff08;比较运算符&#xff09; 关系运算符的结果都是boolean型&#xff0c;也就是要么是true&#xff0c;要么是false 关系表达式 经常用在if结构的条件中或循环结构的条件中 逻辑运算符 && 和 & 使用区别 &&短路与&#xff…

python学习9:python的代码中的数据类型转换

python中数据类型的转换 1.为什么需要转换类型呢&#xff1f; 数据类型之间&#xff0c;在特定的场景下&#xff0c;是可以相互转换的&#xff0c;如字符串转数字&#xff0c;数字转字符串等&#xff1b;数据类型转换&#xff0c;在以后是我们经常使用到的功能&#xff0c;例如…

五、分布式锁-redission

源码仓库地址&#xff1a;gitgitee.com:chuangchuang-liu/hm-dingping.git 1、redission介绍 目前基于redis的setnx特性实现的自定义分布式锁仍存在的问题&#xff1a; 问题描述重入问题同一个线程无法多次获取统一把锁。当方法A成功获取锁后&#xff0c;调用方法B&#xff0…

腾讯云服务器价格查询系统,2024年1年、3年和5年活动价格表

腾讯云服务器多少钱一年&#xff1f;61元一年起。2024年最新腾讯云服务器优惠价格表&#xff0c;腾讯云轻量2核2G3M服务器61元一年、2核2G4M服务器99元一年可买三年、2核4G5M服务器165元一年、3年756元、轻量4核8M12M服务器646元15个月、4核16G10M配置32元1个月、312元一年、8核…

Java生成动态图形验证码

dome /*** ClassName : VerifyCodeController* Description : 图片验证码* Author : llh* Date: 2024-03-22 10:48*/ Controller RequestMapping("/verifycode") public class VerifyCodeController {Resourceprivate StringRedisTemplate stringRedisTemplate;Get…