Spring Boot 中的 @Lazy 注解:延迟加载的深入解析与实践
1. 引言在 Spring Boot 应用中Bean 的创建和依赖注入通常是在应用启动时完成的。这种默认的急切加载Eager Loading模式确保了所有 Bean 在需要时都已准备就绪但有时也会带来不必要的启动开销特别是对于那些初始化成本高、使用频率低的 Bean。Spring 框架提供了Lazy注解来解决这一问题。通过Lazy我们可以将 Bean 的创建推迟到第一次真正被请求时从而优化应用的启动性能。本文将深入解析Lazy注解的工作原理、使用场景、配置方式以及需要注意的陷阱。2. Lazy 注解的核心概念2.1 什么是延迟加载延迟加载Lazy Loading是一种设计模式其核心思想是“按需创建”。在 Spring 上下文中它意味着一个被标记为Lazy的 Bean其初始化过程调用构造方法、执行PostConstruct方法、注入依赖等不会在 Spring 容器启动时立即执行而是会延迟到该 Bean 第一次被其他组件请求例如通过Autowired注入或ApplicationContext.getBean()调用时才触发。2.2 Lazy 与默认急切加载的对比特性急切加载 (默认)延迟加载 (Lazy)初始化时机Spring 容器启动时第一次被请求时启动性能可能较慢所有 Bean 都初始化通常更快只初始化必需的 Bean内存占用启动后即占用使用时才占用适用场景大多数核心、高频使用的 Bean初始化成本高、使用不确定或低频的 Bean潜在问题启动时间长首次请求时有延迟循环依赖需配合Lazy解决3. Lazy 的使用方式3.1 在 Bean 定义上使用最直接的方式是在Component,Service,Repository,Configuration等注解的类上添加Lazy。import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; Service Lazy // 这个 Service 将被延迟初始化 public class HeavyInitializationService { public HeavyInitializationService() { // 模拟耗时的初始化操作 System.out.println(HeavyInitializationService 构造函数被调用初始化成本很高...); try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } } public void doSomething() { System.out.println(HeavyInitializationService 正在工作...); } }3.2 在配置类中与 Bean 一起使用在 Java 配置类中你可以将Lazy注解与Bean方法结合使用。import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Lazy; Configuration public class AppConfig { Bean Lazy // 这个 Bean 将被延迟初始化 public ExpensiveDataSource expensiveDataSource() { System.out.println(正在创建昂贵的 DataSource...); // 模拟创建连接池等耗时操作 return new ExpensiveDataSource(); } }3.3 在注入点使用你还可以在依赖注入点如字段、构造方法参数、Setter 方法参数上使用Lazy。这只会延迟该特定依赖的注入而不是延迟目标 Bean 本身的初始化如果目标 Bean 在其他地方被急切请求它仍会提前初始化。import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; Service public class MyService { // 延迟注入这个依赖 Autowired Lazy private HeavyInitializationService heavyService; public void execute() { // 第一次调用 heavyService 的方法时才会触发其初始化 heavyService.doSomething(); } }4. 解决循环依赖Lazy是解决 Spring 中某些类型循环依赖问题的经典方法。其原理是打破初始化时的依赖环。Service public class ServiceA { private final ServiceB serviceB; // 在构造参数上使用 LazySpring 会注入一个代理对象 public ServiceA(Lazy ServiceB serviceB) { this.serviceB serviceB; } } Service public class ServiceB { private final ServiceA serviceA; public ServiceB(ServiceA serviceA) { this.serviceA serviceA; } }在上面的例子中ServiceA依赖于ServiceB而ServiceB又依赖于ServiceA。通过在ServiceA的构造参数上添加LazySpring 在初始化ServiceA时不会立即去初始化一个完整的ServiceBBean而是先注入一个ServiceB的代理Proxy。当ServiceA后续真正调用serviceB的方法时代理才会触发ServiceB的实际初始化。此时ServiceA已经初始化完成ServiceB可以成功注入它从而解决了循环依赖。5. 注意事项与最佳实践不要滥用对于绝大多数简单、核心的 Bean使用默认的急切加载即可。滥用Lazy会使依赖关系复杂化并可能掩盖启动时的配置错误。理解代理机制Spring 通过 CGLIB 或 JDK 动态代理来实现延迟加载。这意味着被Lazy标记的 Bean 在注入时实际上是代理对象。这可能会影响getClass()、类型转换cast和Autowired到具体类型的操作。与Scope的交互对于原型作用域prototype的 BeanLazy注解实际上没有意义因为每次请求都会创建一个新实例。配置类本身也可以标记为Lazy这意味着该配置类中定义的所有Bean方法默认都会延迟初始化除非某个Bean方法显式地标注了Lazy(false)。调试在调试时注意 Bean 的初始化日志。延迟加载的 Bean 其初始化日志会在首次请求时出现而不是在应用启动时。6. 总结Lazy注解是 Spring Boot 性能优化工具箱中的一个有用工具。它通过将 Bean 的初始化推迟到真正需要时可以有效减少应用的启动时间。它主要用于初始化成本高如建立数据库连接池、加载大文件的 Bean。在应用生命周期中可能根本用不到的 Bean如某些特定配置下的功能模块。作为解决特定循环依赖问题的手段。正确使用Lazy需要对 Spring 的 Bean 生命周期和代理机制有清晰的理解。在大多数情况下保持默认的急切加载模式是更简单、更可预测的选择。

相关新闻

江苏师范大学Advanced Science:快速焦耳热构筑碳壳封装非对称超级电容器,105.6 Wh kg-¹、25000 次循环保持 93.7%

江苏师范大学Advanced Science:快速焦耳热构筑碳壳封装非对称超级电容器,105.6 Wh kg-¹、25000 次循环保持 93.7%

1. 背景非对称超级电容器(ASC)通过匹配正、负极不同电位窗口,有望在保持高功率输出的同时提升能量密度;然而,赝电容材料虽然容量高,却常受限于反应动力学迟缓、循环结构衰退和严重自放电。碳壳封装被认为是…

2026/10/2 22:51:54 阅读更多 →
GitHub开源深度评测|10天斩获2.2万星!xAI grok-build:Rust全屏TUI编码Agent工程全景解析

GitHub开源深度评测|10天斩获2.2万星!xAI grok-build:Rust全屏TUI编码Agent工程全景解析

GitHub开源深度评测|10天斩获2.2万星!xAI grok-build:Rust全屏TUI编码Agent工程全景解析 项目星级:22.2k Stars(10天极速爆火) 项目归属:xAI 官方开源编码智能体项目 核心定位:Rust …

2026/9/23 0:56:40 阅读更多 →
在Taotoken模型广场根据场景与预算选择合适的AI模型

在Taotoken模型广场根据场景与预算选择合适的AI模型

在Taotoken模型广场根据场景与预算选择合适的AI模型 面对市场上众多的AI模型,开发者和团队在项目启动时常常面临一个核心问题:如何在有限的预算和明确的技术要求下,选择一个合适的模型?直接逐一研究各个厂商的定价、性能参数和接…

2026/10/2 0:32:56 阅读更多 →

最新新闻

2026客户拜访视频自动生成笔记,TaoToken统一Key接入哪款AI工具好用?

2026客户拜访视频自动生成笔记,TaoToken统一Key接入哪款AI工具好用?

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 23:30:50 阅读更多 →
Agent之Framework:Paperclip的安装和使用方法、案例应用之详细攻略(含TaoToken统一Key配置)

Agent之Framework:Paperclip的安装和使用方法、案例应用之详细攻略(含TaoToken统一Key配置)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 23:30:50 阅读更多 →
开关电源EMC整改:PCB环路与变压器寄生参数是关键

开关电源EMC整改:PCB环路与变压器寄生参数是关键

1. 为什么EMC整改总在滤波电容上打转,却没人动PCB和变压器?开关电源EMC不过关——这几乎是每个硬件工程师职业生涯里绕不开的“魔咒”。你反复换掉输入端的X电容、Y电容,加粗共模电感线径,把滤波器从两级堆到三级,示波…

2026/10/2 23:30:50 阅读更多 →
零基础靠AI做微信小游戏,仅花30元完整上线

零基础靠AI做微信小游戏,仅花30元完整上线

文章目录前言1. 先唠唠我都薅了哪些工具羊毛2. 通勤路上,聊天聊出游戏原型MVP3. 备案千万不要等做完游戏再动手!血泪教训4. H5转微信小游戏,整个项目最折磨人的环节5. 四个大坑,大家直接抄我的避坑作业5.1 坑一:AI生成…

2026/10/2 23:30:50 阅读更多 →
HIL测试中的总线与通信协议:从CAN到车载以太网的实战解析

HIL测试中的总线与通信协议:从CAN到车载以太网的实战解析

干HIL测试这行当的,时间久了都会有个感觉:真正让台架复杂到让人头疼的,往往不是那个被控对象的数学模型,而是台架上那一堆总线接口。模型算得再快,信号发不出去或者报文格式不对,整个闭环就是废的。很多刚接…

2026/10/2 23:30:50 阅读更多 →
9款AI论文工具实测:从开题报告到文献综述,TaoToken统一Key怎么配

9款AI论文工具实测:从开题报告到文献综述,TaoToken统一Key怎么配

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 23:29:48 阅读更多 →

日新闻

从零搭建AI工程化:模型之外的完整闭环

从零搭建AI工程化:模型之外的完整闭环

先搞清楚一件事:从零开始做 AI 工程化,难的从来不是调模型、写提示词,而是把一套原型 Demo 变成长得像是“正经系统”的东西。你手里可能已经有了能跑通的代码,也可能刚读完一些概念,但真到了要把它变成可维护、可观测…

2026/10/2 0:00:20 阅读更多 →
大模型训练显存估计与混合精度训练实战指南

大模型训练显存估计与混合精度训练实战指南

1. 大模型训练显存估计与混合精度训练详解显存不够用,几乎是每个做大模型训练的人都会撞上的第一堵墙。你可能也经历过:模型代码写完了,数据管道跑通了,满心欢喜地按下训练启动脚本,结果几秒钟后终端弹出一行红字——C…

2026/10/2 0:00:20 阅读更多 →
小样本学习数据集选型指南:27个真正可用的高质量数据集

小样本学习数据集选型指南:27个真正可用的高质量数据集

1. 小样本学习的“弹药库”:为什么你总在找数据集,却总找不到真正能用的? 小样本、数据集——这两个词最近半年在我处理的200多个AI项目咨询里,出现频率排进前三。不是模型调不好,不是代码写不对,而是卡在…

2026/10/2 0:00:20 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/10/1 19:40:48 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/10/1 19:41:40 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/10/1 20:05:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 10:36:31 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 5:26:06 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 6:09:11 阅读更多 →