使用Lombok构造注解省略@Autowired的相关Spring注入疑问
Spring构造器注入与Lombok注解的问题解答
一、可省略@Autowired的Lombok构造注解
根据Spring 4.3+的规则:当Bean仅存在一个构造器时,该构造器上的@Autowired可以省略。对应的Lombok注解是:
@AllArgsConstructor:生成包含所有类字段的构造器,只要你的Bean没有其他构造器(手动编写或其他Lombok注解生成),就能省略@Autowired实现构造器注入@RequiredArgsConstructor:生成包含所有final或@NonNull修饰字段的构造器,同样,当Bean只有这个构造器时,无需@Autowired即可完成构造器注入
@NoArgsConstructor仅生成无参构造器,单独使用它无法实现构造器注入(没有参数接收依赖),因此不满足省略@Autowired的前提。
二、仅使用@NoArgsConstructor是否足够?
完全不够。@NoArgsConstructor只会生成无参构造器,而构造器注入依赖于带参数的构造器来接收Spring容器中的Bean。如果只加这个注解,Spring无法通过构造器注入依赖,要么改用字段注入/Setter注入,要么补充带参数的构造器注解。
三、同时使用@NoArgsConstructor和@AllArgsConstructor是否属于“多个构造器”?
是的,这两个注解会为Bean生成无参构造器和全参构造器两个构造器,属于Spring规则中“存在多个构造器”的情况。
按照Spring官方要求,此时必须为其中一个构造器添加@Autowired,否则Spring容器无法确定使用哪个构造器创建Bean,会抛出初始化异常。至于讲师这么用的原因,可能是:
- 讲师手动给目标构造器添加了
@Autowired但未明确说明 - 项目中存在其他配置让Spring识别出要使用的构造器
- 该Bean本身没有需要注入的依赖,无参构造器即可满足需求(但这种情况谈不上构造器注入)
四、同时使用@NoArgs、@AllArgs、@ReqArgs时的注入情况
这三个注解会生成三个构造器:无参、全参、包含必填字段的构造器。此时Spring容器识别到多个构造器,必须给你用来注入依赖的那个构造器添加@Autowired,否则会导致Bean创建失败。
判断注入是否正常的方法:
- 启动项目,查看是否出现构造器相关的初始化异常(如
NoUniqueBeanDefinitionException) - 在构造器中添加日志打印,观察Spring实际调用的是哪个构造器
- 在依赖字段上打断点,检查是否被正确赋值
内容的提问来源于stack exchange,提问作者kakoker
相关产品推荐
相关产品推荐

