@lazy 是 spring 的延迟初始化注解,使 bean 首次使用时才创建,适用于大型客户端、低频服务、依赖未就绪组件及测试功能 bean;支持类、@bean 方法、@autowired 注入点三种用法,对 singleton 和 prototype 均生效但行为不同。

@Lazy 是 Spring 提供的延迟初始化注解,用于让 Bean 在首次被使用时才创建,而非容器启动时就实例化。这对启动耗时长、依赖复杂或实际使用率低的 Bean 非常有效,能显著缩短应用启动时间。
哪些 Bean 适合加 @Lazy?
不是所有 Bean 都需要延迟加载,盲目添加反而可能掩盖设计问题。以下几类较典型:
- 大型服务组件(如集成外部系统 SDK 的客户端,初始化需网络连接或配置解析)
- 非核心业务模块的 Service 或 Repository(如报表导出、日志归档等低频功能)
- 依赖其他尚未就绪 Bean 的组件(避免循环依赖或启动顺序问题)
- 测试环境启用但生产不常用的功能 Bean(配合 @Profile 使用更精准)
@Lazy 的三种常用用法
根据作用范围不同,@Lazy 可以加在不同位置,效果略有差异:
- 加在 @Component / @Service 等类上:该类定义的 Bean 默认延迟初始化(包括通过 @Autowired 注入时也延迟)
- 加在 @Bean 方法上:仅对该方法返回的 Bean 生效,适用于 @Configuration 类中自定义 Bean
- 加在 @Autowired 字段或构造器参数上:表示“只在真正用到这个依赖时才初始化它”,即使目标 Bean 本身未标注 @Lazy,也能触发延迟获取(Spring 5.1+ 支持)
注意作用域与代理机制
@Lazy 对 singleton 和 prototype Bean 都生效,但行为不同:
- singleton Bean 加 @Lazy 后,首次调用 getBean() 或注入点被访问时才创建实例,之后复用同一实例
- prototype Bean 加 @Lazy,每次 getBean() 都会触发新实例创建,但仍是“按需创建”而非启动即造
- 如果 Bean 实现了接口且使用 JDK 动态代理(如 AOP 切面),Spring 会生成一个懒初始化代理对象;首次调用方法时才真正初始化目标实例
配合 @Primary 和 @Qualifier 的注意事项
当存在多个同类型 Bean 时,@Lazy 不影响自动装配的匹配逻辑:
- 若用 @Autowired + @Lazy 注入,Spring 仍按 @Primary / @Qualifier 规则选择目标 Bean,只是延迟实例化
- 不能对抽象类或接口直接加 @Lazy(无意义),必须作用于具体实现类或 @Bean 方法
- 构造器注入时若所有参数都带 @Lazy,整个 Bean 初始化仍会延迟;但如果某个依赖没加 @Lazy,它会在当前 Bean 创建前就被强制初始化
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











