Spring @Lazy注解详解

news2025/5/15 18:20:37

文章目录

  • @Lazy注解主要作用
  • 工作原理
  • 使用方法
  • 注意事项
  • 总结

@Lazy注解主要作用

首先,让我们看看@Lazy注解的源码,截图如下:
在这里插入图片描述
源码注释翻译如下
在这里插入图片描述
通过源码,我们可以看到:@Lazy注解是一个标记注解,用于标记 bean会被延迟初始化。@Lazy注解可以用于类,方法,构造器,参数,字段上。从整体上看,@Lazy注解的作用主要有下面三点:

  1. 延迟初始化Bean

    • 默认情况下,Spring容器在启动时会立即创建和初始化所有单例(singleton)Bean,这称为预加载(eager initialization)
    • 使用@Lazy注解可以将Bean的初始化延迟到第一次使用时才进行,即懒加载(lazy initialization)
  2. 优化资源使用和启动时间

    • 对于一些在应用启动时不一定会使用的Bean,延迟初始化可以减少启动时间,提高应用的响应速度。
    • 减少不必要的资源消耗,尤其是在资源密集型的应用中尤为重要。
  3. 解决循环依赖问题

    • 在某些情况下,Bean之间存在循环依赖,提前初始化可能导致问题。使用@Lazy可以打破这种循环依赖。

工作原理

在分析完@Lazy注解的主要作用后,接下来我们来看看@Lazy注解的工作原理,这里归纳为下面三点:

  1. 代理机制

    • Spring通过创建代理对象来实现Bean的延迟初始化。当一个懒加载Bean被引用时,Spring并不会立即创建其实例,而是创建一个代理对象。
    • 当对代理对象的方法进行实际调用时,代理会触发Bean的真实创建和初始化。
  2. 延迟加载的实现步骤

    • 容器启动时:Spring扫描到带有@Lazy注解的Bean,不会立即实例化,而是生成一个代理对象并注册到容器中。
    • 第一次访问时:当应用代码首次引用该Bean时,代理对象会触发实际Bean的创建和依赖注入过程。
  3. 与@Scope搭配使用
    @Lazy通常与@Scope("singleton")@Scope("prototype")搭配使用,以控制单例或原型Bean的懒加载行为。

使用方法

根据上面我们分析@Lazy注解源码时,我们知道@Lazy注解可以用于类,方法,构造器,参数,字段上,因此,我们将分别举例来说明它们是如何使用的。

1、 在Bean定义上使用@Lazy

@Component
@Lazy
public class LazyBean {
   // Bean内容
}

2、在配置类中使用@Lazy注解

@Configuration
public class AppConfig {

   @Bean
   @Lazy
   public LazyBean lazyBean() {
       return new LazyBean();
   }
}

3、 在依赖注入点使用@Lazy

对特定的依赖进行懒加载,而不是整个Bean。

@Component
public class AnotherBean {

   private final LazyBean lazyBean;

   public AnotherBean(@Lazy LazyBean lazyBean) {
       this.lazyBean = lazyBean;
   }
}

注意事项

在日常工作中,我们使用@Lazy 注解,需要注意以下事项:

1、代理开销:使用@Lazy会引入代理对象,可能会带来一定的性能开销,尤其是在高频调用的场景下需要权衡利弊。

2、配置复杂性:过度使用懒加载可能导致配置复杂,难以跟踪Bean的初始化时机,影响调试和维护。

3、测试与调试:在测试和调试时,延迟初始化可能会导致某些Bean未按预期初始化,需要注意测试环境的配置。

总结

@Lazy注解能可以解决基于构造器注入产生的循环依赖

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

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

相关文章

中国品牌日 | 以科技创新为引领,激光院“风采”品牌建设结硕果

品牌,作为企业不可或缺的隐形财富,在当今竞争激烈的市场环境中,其构建与强化已成为推动企业持续繁荣的关键基石。为了更好地保护自主研发产品,激光院激光公司于2020年3月7日正式注册“风采”商标,创建拥有自主知识产权…

GNU Screen 曝多漏洞:本地提权与终端劫持风险浮现

SUSE安全团队全面审计发现,广泛使用的终端复用工具GNU Screen存在一系列严重漏洞,包括可导致本地提权至root权限的缺陷。这些问题同时影响最新的Screen 5.0.0版本和更普遍部署的Screen 4.9.x版本,具体影响范围取决于发行版配置。 尽管GNU Sc…

05.three官方示例+编辑器+AI快速学习three.js webgl - animation - skinning - ik

本实例主要讲解内容 这个Three.js示例展示了**反向运动学(Inverse Kinematics, IK)**在3D角色动画中的应用。通过加载一个角色模型,演示了如何使用IK技术实现自然的肢体运动控制,如手部抓取物体的动作。 核心技术包括: CCD反向运动学求解器…

第29节:现代CNN架构-Inception系列模型

引言 Inception系列模型是卷积神经网络(CNN)发展历程中的重要里程碑,由Google研究人员提出并不断演进。这一系列模型通过创新的架构设计,在保持计算效率的同时显著提升了图像识别任务的性能。从最初的Inception v1到最新的Inception-ResNet,每一代Inception模型都引入了突破…

【深度学习】将本地工程上传到Colab运行的方法

1、将本地工程(压缩包)上传到一个新的colab窗口:如下图中的 2.zip,如果工程中有数据集,可以删除掉。 2、解压压缩包。 !unzip /content/2.zip -d /content/2 如果解压出了不必要的文件夹可以递归删除: #…

RabbitMQ 中的六大工作模式介绍与使用

文章目录 简单队列(Simple Queue)模式配置类定义消费者定义发送消息测试消费 工作队列(Work Queues)模式配置类定义消费者定义发送消息测试消费负载均衡调优 发布/订阅(Publish/Subscribe)模式配置类定义消…

Android HttpAPI通信问题(已解决)

使用ClearTextTraffic是Android中一项重要的网络设置,它控制了应用程序是否允许在不使用HTTPS加密的情况下访问网络。在默认情况下,usescleartexttraffic的值为true,这意味着应用程序可以通过普通的HTTP协议进行网络通信。然而,这样的设置可能会引发一些安全问题,本文将对…

【SSM-SpringMVC(二)】Spring接入Web环境!本篇开始研究SpringMVC的使用!SpringMVC数据响应和获取请求数据

SpringMVC的数据响应方式 页面跳转 直接返回字符串通过ModelAndView对象返回 回写数据 直接返回字符串返回对象或集合 页面跳转: 返回字符串方式 直接返回字符串:此种方式会将返回的字符串与视图解析器的前后缀拼接后跳转 RequestMapping("/con&…

docker安装mysql8, 字符集,SQL大小写规范,sql_mode

一、Docker安装MySQL 使用Docker安装MySQL,命令如下 docker run -d \-p 3306:3306 \-v mysql_conf:/etc/mysql/conf.d \-v mysql_data:/var/lib/mysql \--name mysql \--restartalways \--privileged \-e MYSQL_ROOT_PASSWORD1234 \mysql:8.0.30参数解释 🐳 dock…

【SSM-SSM整合】将Spring、SpringMVC、Mybatis三者进行整合;本文阐述了几个核心原理知识点,附带对应的源码以及描述解析

SSM整合的基础jar包 需要创建的层级: controller层 该层下需要创建对应的控制器Servlet POJO文件夹 该层下需要创建与数据库对应的POJO类 mapper层 该层下需要创建Mapper的接口实现 service层 该层下需要创建业务层的接口及其接口实现 需要创建的配置文件&#x…

MYSQL数据库集群高可用和数据监控平台

项目环境 项目拓扑结构 软硬件环境清单 软硬件环境清单 软硬件环境清单 主机名IP硬件软件 master1 192.168.12.130 VIP:192.168.12.200 cpu:1颗2核 内 存:2GB HDD:20GB 网 络:NAT VmWare17 OpenEuler22.03 SP4 MySql8.0.3…

uni-app vue3版本打包h5后 页面跳转报错(uni[e] is not a function)

先看问题 解决方案 在HBuilderX项目中,若需在Web配置中显式关闭摇树优化(Tree Shaking),可以通过以下步骤实现:首先,在配置中打开摇树优化,然后再将其关闭。这样操作后,配置文件中会…

【Redis】缓存穿透、缓存雪崩、缓存击穿

1.缓存穿透 是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,导致请求直接穿透缓存到达数据库,给数据库带来压力的情况。 常见的解决方案有两种: 缓存空对象:实现简单,维护方便&am…

告别数据僵尸!Redis实现自动清理过期键值对

在这个数据爆炸的时代,内存就像珍贵的土地资源,而Redis则是这片土地上的智能管家。它不仅能高效存储数据,还能像秋叶定时凋零般,让键值对在指定时间自动消失。今天,就让我们揭开这项"数据保鲜"技术的奥秘。 …

web第三次课后作业--基于JDBC对mysql数据库的增删查改操作

一、工程搭建步骤 1.新建java项目,添加jdbc依赖 2.写java程序 3.添加mysql数据源,连接本地数据库 4.运行程序二、运行结果 三、代码 代码解析 加载数据驱动 try {Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundExceptio…

[数据结构]5. 栈-Stack

栈-Stack 1. 介绍2. 栈的实现2.1 基于链表的实现2.2 基于数组的实现 3. 栈操作CreateInitilizateDestoryPushPopTopEmptySize 1. 介绍 栈(stack) 是一种遵循先入后出逻辑的线性数据结构。顶部称为“栈顶”,底部称为“栈底”。把元素添加到栈…

基于Spring Boot + Vue的高校心理教育辅导系统

一、项目背景介绍 随着高校对学生心理健康教育的重视,传统的人工心理辅导与测评模式已经难以满足广大师生的个性化需求。为了提高心理服务的效率、便捷度和覆盖范围,本项目开发了一个高校心理教育辅导系统,集成心理评测、辅导预约、留言交流…

JavaSwing之-JDialog

JavaSwing之-JDialog JDialog 是 Java Swing 中用于创建对话框窗口的容器类,继承自 Dialog 类(AWT),常用于显示临时信息、获取用户输入或执行模态操作。它是 javax.swing.JDialog 包中的类。 与 JFrame 不同的是,JDia…

【学习路线】 游戏客户端开发入门到进阶

目录 游戏客户端开发入门到进阶:系统学习路线与推荐书单一、学习总原则:从底层出发,项目驱动,持续迭代二、推荐学习路线图(初学者→进阶)第一阶段:语言基础与编程思维第二阶段:游戏开…

部署安装gitlab-ce-17.9.7-ce.0.el8.x86_64.rpm

目录 ​编辑 实验环境 所需软件 实验开始 安装部署gitlab171.配置清华源仓库(版本高的系统无需做)vim /etc/yum.repos.d/gitlab-ce.repo 2.提前下载包dnf localinstall gitlab-ce-17.9.7-ce.0.el8.x86_64.rpm --rocklinux 3.修改配…