@lazy用于延迟初始化bean,即首次使用时才创建实例,适用于解决循环依赖、降低启动耗时或按需加载重量级组件;可标注在类、@bean方法或依赖注入处,但需注意单例特性、接口注入要求及全局启用风险。

在 Spring 的依赖注入中,@Lazy 注解用于延迟初始化 Bean,即容器启动时不创建该 Bean 实例,而是在第一次真正被使用(如通过 ApplicationContext.getBean() 获取或被其他 Bean 注入并调用)时才初始化。它常用于解决循环依赖、降低启动耗时、或按需加载重量级组件。
什么时候需要 @Lazy
当某个 Bean 初始化开销大(如连接数据库、加载大量配置、启动外部服务),但并非所有场景都会用到它;或者两个 Bean 相互依赖(A 依赖 B,B 又依赖 A),Spring 默认会报错,加 @Lazy 可绕过早期初始化校验,让其中一方延迟加载,从而打破循环。
@Lazy 的常见使用位置
-
在 @Component / @Service 等类上标注:整个 Bean 延迟初始化
例如:@Service @Lazy public class UserService { ... } -
在 @Bean 方法上标注:控制该方法返回的 Bean 是否懒加载
例如:@Bean @Lazy public OrderService orderService() { return new OrderService(); } -
在构造器/字段/Setter 方法的依赖注入处标注:仅对该依赖项启用懒加载(注意:字段注入需配合
@Lazy+ 接口类型,否则可能报错)
例如:private final UserService userService;public UserController(@Lazy UserService userService) { this.userService = userService; }
使用 @Lazy 的注意事项
@Lazy 不是万能的,有几点关键细节必须注意:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 如果目标 Bean 是单例(默认作用域),懒加载只影响首次创建时机,之后每次获取都是同一个实例
- 字段注入时,若直接注入具体类(非接口),Spring 可能无法生成代理,导致
@Lazy失效或抛出异常;推荐注入接口,或改用构造器注入 - 在配置类中使用
@Lazy的@Bean方法,该方法体内的逻辑会在首次调用时执行(包括 new 对象、调用 init 方法等) - 全局开启懒加载(
@Configuration(proxyBeanMethods = false)或spring.main.lazy-initialization=true)会影响所有 Bean,慎用,建议按需局部控制
一个典型循环依赖 + @Lazy 的例子
A 服务需要调用 B 服务,B 服务也需要调用 A 服务:
@Service
public class ServiceA {
private final ServiceB serviceB;
public ServiceA(ServiceB serviceB) { this.serviceB = serviceB; }
}
@Service
public class ServiceB {
private final ServiceA serviceA;
public ServiceB(@Lazy ServiceA serviceA) { this.serviceA = serviceA; }
}
这里给 ServiceB 构造器中的 ServiceA 加了 @Lazy,Spring 就不会在创建 ServiceB 时急着创建 ServiceA,而是注入一个代理对象,等真正调用 serviceA.xxx() 时才触发 ServiceA 的初始化。










