当前位置: 首页 > news >正文

@Lazy

@Lazy

@Lazy 是 Spring 框架中的一个注解,用于控制 Bean 的加载时机,实现延迟初始化(Lazy Initialization)。它的核心作用是:推迟 Bean 的创建,直到第一次被实际使用时才初始化,而不是在 Spring 容器启动时就立即创建

  1. 作用于 @Bean 方法
@ConfigurationpublicclassAppConfig{@Bean@Lazy// 只有当其他 Bean 注入或调用此方法时才会创建publicExpensiveServiceexpensiveService(){returnnewExpensiveService();// 假设初始化很耗时}}
  1. 作用于 @Component 或其派生注解(如 @Service, @Repository)
@Service@Lazy// 整个类的 Bean 延迟初始化publicclassUserService{publicUserService(){System.out.println("UserService 被创建了");}}
  1. 作用于依赖注入点(如构造函数、字段)
@ServicepublicclassOrderService{privatefinalUserServiceuserService;// 只有当 OrderService 被使用时,才会初始化 UserServicepublicOrderService(@LazyUserServiceuserService){this.userService=userService;}}
场景说明
减少启动时间避免在应用启动时初始化所有 Bean(尤其是重量级组件)。
解决循环依赖在某些复杂的循环依赖场景中,@Lazy可作为临时解决方案(但应优先重构代码)。
按需加载资源如数据库连接池、缓存客户端等,只在首次调用时初始化。

什么算“第一次被实际使用”?

场景是否触发初始化
@Autowired声明字段(无@Lazy❌ 不会(但若宿主 Bean 非懒加载,则随宿主一起初始化)
@Autowired @Lazy声明字段❌ 声明时不触发,✅ 首次调用方法时触发
applicationContext.getBean()✅ 立即触发
被非懒加载的 Bean 直接依赖✅ 随依赖方初始化时触发
仅被定义但从未引用❌ 永远不会初始化

@Lazy 推迟初始化的“第一次使用”,确实包括通过 @Autowired 或 @Resource 注入后的首次方法调用。
特别是当你在注入点上加上 @Lazy 时,Spring 会使用代理实现真正的“按需初始化”。

你可以在 注入点 上加 @Lazy,这是 Spring 提供的一种高级技巧:

@Lazy@ServicepublicclassRecommendationService{...}@ServicepublicclassUserService{@Autowired@LazyprivateRecommendationServicerecommendationService;}

Spring 会给 recommendationService 字段注入一个 动态代理对象(不是真实实例)。
只有当你第一次调用 recommendationService 的任意方法时,Spring 才会:
1.去容器中查找/创建真正的 RecommendationService Bean;
2. 将后续调用委托给真实对象。

如果在Bean上加了@Lazy , 在注入点里没加会发生什么?

@Lazy@ServicepublicclassRecommendationService{...}@ServicepublicclassUserService{@AutowiredprivateRecommendationServicerecommendationService;// ← 无 @Lazy}
  • 虽然 RecommendationService 是懒加载的,
  • 但由于它被 UserService 直接依赖(且 UserService 不是懒加载的),
  • Spring 在创建 UserService 时 仍然需要一个可用的 RecommendationService 实例来完成注入,
  • 所以 RecommendationService 会在 UserService 初始化时被提前创建(即启动时)。
http://www.jsqmd.com/news/1138133/

相关文章:

  • 磁通门激励与补偿绕组全解析
  • 为什么你调的 LLM 接口不值钱?——从零理解 Agent 开发的正确姿势
  • 15个在线代码协作平台,远程开发必备
  • LED驱动电源生产商评价体系与甄选要点梳理
  • 15个实用的API测试工具,命令行与GUI
  • 卡内基梅隆大学造火箭:AI系统全程设计、打印、发射
  • 从零到 RTAB-Map 3D 建图
  • 北海本地企业GEO工具推荐:酒店住宿行业如何选对靠谱的GEO优化工具
  • 第【60期】--大规模MIMO系统信号检测算法误码率比较 --matlab完整代码+参考文章
  • edge常用插件
  • 免费英雄联盟换肤神器:R3nzSkin国服特供版完整使用指南
  • 基于STM32单片机的智能窗户/窗帘晾衣架/雨滴光照检测系统成品31(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_
  • 信号完整性分析实战:3种终端匹配方案对LVTTL信号反射的抑制效果对比
  • BetterNCM Installer:3分钟解锁网易云音乐隐藏功能,打造你的专属音乐播放器
  • AD封装库避坑指南:5个常见封装错误导致PCB焊接失败的案例分析
  • FBI查封NetNut域名,谷歌中断200万台设备代理网络
  • 15个免费的UI设计资源,原型+图标
  • DAY 16
  • TegraRcmGUI终极指南:如何用图形化界面轻松破解Nintendo Switch
  • 130.工业级标准化 PLC 项目!ST 状态机物料分拣|PID 调速 + 称重滤波 + 故障保护
  • 15个实用的API文档生成工具,Swagger替代品
  • Scikit-learn 1.4 实战:3种决策树剪枝策略对比,Kaggle房价预测MAE降低15%
  • 零基础也能学会!2026百度网盘不限速终极指南,永久告别几KB下载
  • 2026年茂名老山檀香厂家推荐:这3家品质靠谱值得信赖
  • 基于STM32单片机的智能家居 防火防盗 报警系统 震动报警GSM短信231(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_
  • 媒体流与轨道:MediaStream 与 MediaStreamTrack
  • 实用Windows风扇控制软件:FanControl让你的电脑安静又高效
  • 免费开源字幕编辑神器:Subtitle Edit 5分钟上手完全指南
  • XSS攻击实战:从Cookie窃取到会话劫持的攻防解析
  • literally 加强语气,≈简直、真的、实在是,无“字面”含义,纯感叹