Spring Boot 中实现懒加载依赖注入的核心是 @Lazy 注解,它通过代理机制延迟 Bean 实例化,支持类级、@Bean 方法级、注入点级使用,可解决循环依赖,但全局启用需谨慎。

Spring Boot 中实现懒加载依赖注入,核心是用 @Lazy 注解控制 Bean 的创建时机,让它不随容器启动立即初始化,而是等到真正被使用时才实例化。这不是简单的“不创建”,而是通过代理机制延迟依赖解析和目标 Bean 的实例化过程。
在 Bean 定义上加 @Lazy
这是最常用的方式,适用于明确知道某个 Bean 启动开销大、使用频率低的场景。
- 加在类上:配合
@Service、@Component等注解使用 - 加在
@Bean方法上:用于配置类中定义的 Bean - 效果:该 Bean 不会在 Spring 容器启动时初始化,首次被注入或调用
getBean()时才创建
例如:
(类级别)@Service @Lazy<br>public class ReportGenerator {<br> public ReportGenerator() {<br> System.out.println("ReportGenerator 初始化中..."); // 启动时不打印<br> }<br>}
在注入点加 @Lazy
当某个 Bean 本身不是懒加载的,但你希望它依赖的另一个 Bean 延迟初始化,就在字段、构造参数或 setter 方法上标注 @Lazy。
- 构造器注入时加在参数上:最推荐,语义清晰且能解决循环依赖
- 字段注入时加在属性上:需配合
@Autowired - 本质是注入一个代理对象,第一次调用其方法时才触发真实 Bean 创建
例如:
(构造器参数级)@Service<br>public class OrderService {<br> private final PaymentService paymentService;<br><br> public OrderService(@Lazy PaymentService paymentService) {<br> this.paymentService = paymentService; // 注入的是代理,非真实实例<br> }<br><br> public void placeOrder() {<br> paymentService.process(); // 此刻才创建 PaymentService 实例<br> }<br>}
用 @Lazy 解决循环依赖
Spring Boot 2.6+ 默认禁止循环依赖,而 @Lazy 是安全、轻量的破局方式。
- 它不依赖三级缓存机制,而是从源头切断强依赖链
- A 构造器注入
@Lazy B→ A 先完成创建,B 推迟到首次调用时再建 → B 创建时 A 已就绪 - 相比开启
spring.main.allow-circular-references=true,更可控、更符合设计意图
全局启用懒加载(慎用)
可通过配置让所有单例 Bean 默认懒加载,但不建议在生产环境无差别开启。
- 启动类上加
@Lazy:因为@SpringBootApplication本身是@Configuration,所以有效 - XML 配置中设
default-lazy-init="true":传统项目适用 - 风险:部分基础设施 Bean(如数据源、事务管理器)必须早期就绪,全局懒加载可能导致运行时报错


















