【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
    @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();
    }
}

运行结果




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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何在Ubuntu使用宝塔部署Emlog网站并发布到公网实现任意浏览器访问

文章目录 前言1. 网站搭建1.1 Emolog网页下载和安装1.2 网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2.Cpolar稳定隧道&#xff08;云端设置&#xff09;2.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 3. 公网访问测试总结 前言 博客作为使…

5G网络架构与组网部署03--5G网络组网部署

1. SA组网与NSA组网 &#xff08;1&#xff09;NSA 非独立组网&#xff1a;终端同时接入4G基站和5G基站&#xff0c;只能实现5G部分功能 &#xff08;2&#xff09;SA组网【最终目标】&#xff1a;5G基站可以单独提供服务&#xff0c;接入的是5G核心网 区别&#xff1a;同一时间…

从0到1:Java构建高并发、高可用分布式系统的实战经验分享

文章目录 引言基础架构选择与设计微服务架构分布式储存与计算 高并发处理策略异步处理与消息队列并发控制与资源隔离 高可用性设计与故障恢复冗余与集群化容错与自我修复监控与运维自动化 引言 随着互联网业务的快速发展和技术迭代升级&#xff0c;作为Java架构师&#xff0c;…

yank+mermaid+甘特图实例

因为notion对于mermaid支持很一般&#xff0c;尤其是甘特图&#xff0c;如果时间跨度大、节点多&#xff0c;字号会小到看不见&#xff0c;非常不方便。 同样的代码&#xff0c;在notion中如下图所示&#xff1a;&#xff08;下图是我的一份年度规划&#xff09; &#xff08;…

【C++ leetcode 】双指针问题

1. 183. 移动零 题目 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 题目链接 . - 力扣&#xff08;LeetCode&#xff09; 画图 和 文字 分…

云效 AppStack + 阿里云 MSE 实现应用服务全链路灰度

作者&#xff1a;周静、吴宇奇、泮圣伟 在应用开发测试验证通过后、进行生产发布前&#xff0c;为了降低新版本发布带来的风险&#xff0c;期望能够先部署到灰度环境&#xff0c;用小部分业务流量进行全链路灰度验证&#xff0c;验证通过后再全量发布生产。本文主要介绍如何通…

九.pandas绘图基础

目录 九.pandas绘图基础 1-柱状图 --参数stackedTrue堆积 --参数figsize(宽,高) --自定义横坐标 --设置字体&显示负号 2.箱型图 3. 折线图 九.pandas绘图基础 Pandas的DataFrame和Series&#xff0c;在matplotlib基础上封装了一个简易的绘图函数, 使得我们在数据处…

刷题训练之滑动窗口

> 作者简介&#xff1a;დ旧言~&#xff0c;目前大二&#xff0c;现在学习Java&#xff0c;c&#xff0c;c&#xff0c;Python等 > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;熟练掌握滑动窗口算法&#xff0c;并且能把下面的…

使用SourceTree获取git代码

1、在浏览器打开git的地址&#xff0c;并且使用用户名和密码登录&#xff1b; 2、输入你的git账号密码&#xff1b; 3、打开SourceTree&#xff0c;地址是自动带过来的&#xff0c;点击第二个“浏览”选择你在D盘或其它盘自己创建的文件夹&#xff1b; 4、正在拉代码&#…

GIT共享 跨仓库操作 子模块

初级代码游戏的专栏介绍与文章目录-CSDN博客 有些文件想在多个项目共享&#xff0c;但是又不能放在一个GIT仓库里&#xff0c;这要用到子模块&#xff08;submodule&#xff09;&#xff0c;说难不难&#xff0c;就是有些细节要注意。 不过说真的&#xff0c;共享向来不是个好主…

并发编程所需的底层基础

一、计算机运行的底层原理 1.多级层次的存储结构 ①:辅存 固态盘不是主要的应用对象&#xff0c;因为固态盘的使用次数是有限的&#xff0c;无法支撑高并发场景 磁盘存储的最基本原理是电生磁。 磁盘的磁道里边有很多的磁颗粒&#xff0c;磁颗粒上边有一层薄膜为了防止磁点氧…

Android VPN TLV协议场景使用

TLV协议格式是一种可变格式&#xff0c; TLV的意思就是&#xff1a;Type类型&#xff0c; Lenght长度&#xff0c;Value值&#xff1b; Type和Length的长度固定&#xff0c;一般那是2、4个字节&#xff1b; Value的长度有Length指定&#xff1b; 解析方法&#xff1a; 1.读取t…

C++ list详解及模拟实现

目录 本节目标 1. list的介绍及使用 1.2 list的使用 2.list的模拟实现 1.对list进行初步的实现 2.头插和任意位置的插入 3.pos节点的删除&#xff0c;头删&#xff0c;尾删 4.销毁list和析构函数 5.const迭代器 6.拷贝构造和赋值操作 3.完整代码 本节目标 1. list的…

Zookeeper的ZAB协议原理详解

Zookeeper的ZAB协议原理详解 如何保证数据一致性。 Paxos&#xff0c; 吸收了主从。 zk 数据模型Watch机制 zab zookeeper原子广播协议。 ZAB概念 ZooKeeper是通过Zab协议来保证分布式事务的最终一致性。 Zab(ZooKeeper Atomic Broadcast,.ZooKeeper原子广播协议)支持…

8 款AI 绘画生成器:从文本创建 AI 艺术图像

人工智能正在影响各行各业&#xff0c;近年来它对创意产业的影响越来越大。由于AI绘画生成器的可操作性&#xff0c;许多人有机会用自己的想法进行艺术创作——即使他们没有接受过系统的专业艺术教育。 最先进的人工智能绘画生成器可能会改变我们未来创作艺术的方式。使用 AI …

pandas中DataFrame用法(python)

简介 DataFrame 一个表格型的数据结构&#xff0c;既有行标签&#xff08;index&#xff09;&#xff0c;又有列标签&#xff08;columns&#xff09;&#xff0c;它也被称异构数据表&#xff0c;所谓异构&#xff0c;指的是表格中每列的数据类型可以不同&#xff0c;比如可以…

【火猫TV】LPL春季赛前瞻:Tabe迎战LNG OMG关键一战!

北京时间3月20日&#xff0c;LPL春季赛今天继续进行&#xff0c;今天将会迎来春季赛常规赛第八周第三个比赛日&#xff0c;今天的两场比赛是LNG战队对阵AL战队以及OMG战队对阵BLG战队&#xff0c;今天的两场比赛对于LNG、AL以及OMG战队都是比较重要的&#xff0c;目前三支战队都…

「Nginx」Nginx配置详解

「Nginx」Nginx配置详解 参考文章1、正向代理和方向代理2、指定域名允许跨域 参考文章 1、Nginx反向代理 2、nginx配置详解 3、Nginx服务器之负载均衡策略&#xff08;6种&#xff09; 1、正向代理和方向代理 2、指定域名允许跨域 map $http_origin $allow_cors {default 1;…

vmare17 安装不可启动的iso镜像系统

由于要测试一个软件&#xff0c;要安装一个Windows11_InsiderPreview_Client_x64_zh-cn_26058.iso 于是在虚拟机里捣鼓一下。但是这个iso好像不能直接启动 这样就无法直接安装了&#xff0c;怎么办呢&#xff0c;可以先用个pe系统引导进去&#xff0c;再在PE系统里安装这个iso…