【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.rhkb.cn/news/284878.html

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

相关文章

GAMES101 作业0

1.向量点积 dot(a, b) a1 * b1 a2 * b2 ... an * bn根据sample&#xff0c;我们可以通过dot进行向量点积 2.矩阵运算 3.给定一个点 P(2,1), 将该点绕原点先逆时针旋转 45◦&#xff0c;再平移 (1,2), 计算出变换后点的坐标&#xff08;要求用齐次坐标进行计算&#xff09;…

11.创建后台系统项目

后台系统项目 兼容性 vite官网&#xff1a;https://vitejs.dev/ vite中文网&#xff1a;https://cn.vitejs.dev/ vite需要node.js版本 >14.0.0&#xff0c;建议16 node -v 查看版本号 创建项目 进入存放目录 执行命令 npm create vitelatest 选择vue框架 选择typescript…

SpringBoot自动装配原理

SpringBootApplication相当于 SpringBootConfiguration EnableAutoConfiguration ComponentScan ●EnableAutoConfiguration&#xff1a;启用 SpringBoot 的自动配置机制 ●ComponentScan&#xff1a; 扫描被Component (Service,Controller)注解的 bean&#xff0c;注解默认…

CTF-辨别细菌

题目描述&#xff1a;try your best to find the flag. 进入靶场后发现是一个游戏&#xff0c;需要全部答对才可以得到最后的flag 查看了一下源码&#xff0c;发现有一个答案模板的模块 尝试解释一下代码 <!-- 答案模版 --> <script id"template_game_pi…

mysql迁移达梦数据库 Java踩坑合集

达梦数据库踩坑合集 文章目录 安装达梦设置大小写不敏感Spring boot引入达梦驱动&#xff08;两种方式&#xff09;将jar包打入本地maven仓库使用国内maven仓库&#xff08;阿里云镜像&#xff09; 达梦驱动yml配置springboot mybatis-plus整合达梦,如何避免指定数据库名&…

【算法篇】逐步理解动态规划1(斐波那契数列模型)

目录 斐波那契数列模型 1. 第N个泰波那契数 2.使用最小花费爬楼梯 3.解码方法 学过算法的应该知道&#xff0c;动态规划一直都是一个非常难的模块&#xff0c;无论是状态转移方程的定义还是dp表的填表&#xff0c;都非常难找到思路。在这个算法的支线专题中我会结合很多力…

Java设计模式之单例模式(多种实现方式)

虽然写了很多年代码&#xff0c;但是说真的对设计模式不是很熟练&#xff0c;虽然平时也会用到一些&#xff0c;但是都没有深入研究过&#xff0c;所以趁现在有空练下手 这章主要讲单例模式&#xff0c;也是最简单的一种模式&#xff0c;但是因为spring中bean的广泛应用&#…

后端工程师快速使用vue和Element

文章目录 Vue1 Vue概述2 快速入门3 Vue指令3.1 v-bind和v-model3.2 v-on3.3 v-if和v-show3.4 v-for3.5 案例 4 生命周期 Element快速使用1 Element介绍2 快速入门3 当前页面中嵌套另一个页面案例代码案例截图 Vue 1 Vue概述 通过我们学习的htmlcssjs已经能够开发美观的页面了…

使用阿里CICD流水线打包Java项目到阿里的docker镜像私仓,并自动部署到服务器启动服务

文章目录 使用阿里CICD流水线打包Java项目到阿里的docker镜像私仓&#xff0c;并自动部署到服务器启动服务1、功能原理实现2、将自己的Java项目通过Git上传到阿里的代码仓库中&#xff0c;也可以通过绑定Gitee或者GitHub账号进行导入3、创建自己的阿里云镜像私仓3、进入阿里的C…

wayland(xdg_wm_base) + egl + opengles 使用 Assimp 加载材质文件Mtl 中的纹理图片最简实例(十六)

文章目录 前言一、3d 立方体 model 属性相关文件1. cube.obj2. cube.Mtl3. 纹理图片 cordeBouee4.jpg二、代码实例1. 依赖库和头文件1.1 assimp1.2 stb_image.h2. egl_wayland_obj_cube.cpp3. Matrix.h 和 Matrix.cpp4. xdg-shell-client-protocol.h 和 xdg-shell-protocol.c5.…

部署mysql,前端,后端

部署mysql docker pull mysql 从镜像源中拉取镜像。 创建mysql容器 docker run -d \--name mysql_container \-p 3306:3306 \-e TZAsia/Shanghai \-e MYSQL_ROOT_PASSWORD123 \--restartalways \-v /opt/mysql:/var/lib/mysql \mysql -d后台运行&#xff0c;--name指定容器…

ShardingSphere水平分表——开发经验(2)

1. 什么场景下分表&#xff1f; 数据量过大或者数据库表对应的磁盘文件过大。 Q&#xff1a;多少数据分表&#xff1f; A&#xff1a;网上有人说1kw&#xff0c;2kw&#xff1f;不准确。 1、一般看字段的数量&#xff0c;有没有包含text类型的字段。我们的主表里面是不允许有t…

模拟-算法

文章目录 替换所有的问号提莫攻击Z字形变换外观数列数青蛙 替换所有的问号 算法思路&#xff1a; 从前往后遍历整个字符串&#xff0c;找到问号之后&#xff0c;就遍历 a ~ z 去尝试替换即可。 class Solution {public String modifyString(String s) {char[] ss s.toCharA…

谷歌DeepMind推出3D游戏AI代理SIMA,实现自然语言操控游戏新纪元

近日&#xff0c;谷歌DeepMind研究团队推出了一款名为SIMA的创新AI代理&#xff0c;专为3D游戏环境设计。这款代理独树一帜&#xff0c;无需访问游戏源代码或依赖定制API&#xff0c;仅通过输入图像和简单的自然语言文本指令&#xff0c;便能实现与人类玩家相当的游戏操作。 AI…

MATLAB的使用(一)

一&#xff0c;MATLAB的编程特点 a,语法高度简化&#xff1b; b,脚本式解释型语言&#xff1b; c,针对矩阵的高性能运算&#xff1b; d,丰富的函数工具箱支持&#xff1b; e,通过matlab本体构建跨平台&#xff1b; 二&#xff0c;MATLAB的界面 工具栏:提供快捷操作编辑器…

1-Flume中agent的source

Flume&#xff08;1.11.0版本&#xff09; 简介 概述 Flume本身是由Cloudera公司开发的后来贡献给了Apache的一套针对日志数据进行收集(collecting)、汇聚(aggregating)和传输(moving)的机制 Flume本身提供了简单且灵活的结构来完成日志数据的传输 Flume有两大版本&#x…

RIP,EIGRP,OSPF的区别

1.路由协议 能否选择出最优路径 2.路由协议 是否能够完成故障切换/多久能够完成故障切换 3.路由协议 是否会占用过大硬件资源 -- RIP -- 路由信息协议 跳数:一次三层设备的转发算一跳 中间隔的设备数量 不按照链路带宽来算 Rip认为路径一样,这个时候。 下面这个跳数不…

【C语言_数组_复习篇】

目录 一、数组的概念 二、数组的类型 三、一维数组 3.1 一维数组的创建 3.2 一维数组的初始化 3.3 一维数组的访问 3.4 一维数组在内存中的存储 四、二维数组 4.1 二维数组的创建 4.2 二维数组的初始化 4.3 二维数组的访问 4.4 二维数组在内存中的存储 五、变长数组 六、…

kafka面试篇

消息队列的作用&#xff1a;异步、削峰填谷、解耦 高可用&#xff0c;几乎所有相关的开源软件都支持&#xff0c;满足大多数的应用场景&#xff0c;尤其是大数据和流计算领域&#xff0c; kafka高效&#xff0c;可伸缩&#xff0c;消息持久化。支持分区、副本和容错。 对批处理…

ChatGPT论文指南|揭秘8大ChatGPT提示词研究技巧提升写作效率【建议收藏】

点击下方▼▼▼▼链接直达AIPaperPass &#xff01; AIPaperPass - AI论文写作指导平台 公众号原文▼▼▼▼&#xff1a; ChatGPT论文指南|揭秘8大ChatGPT提示词研究技巧提升写作效率【建议收藏】 目录 1.写作方法 2.方法设计 3.研究结果 4.讨论写作 5.总结结论 6.书…