如何向使用@RequiredArgsConstructor注解的类构造方法传递参数
问题解决方案
首先明确两个核心误区:
@RequiredArgsConstructor不会生成无参构造方法,只会为类中未赋值的final字段、标记@NonNull的字段生成带对应参数的构造方法- 你给final字段添加
@Autowired走字段注入,和lombok构造注入的逻辑冲突,手动写构造时没有给final字段赋值,自然会触发IDE未初始化报错
方案1:继续使用lombok注解,无需手动写构造
- 移除两个final字段上的
@Autowired注解,Spring 4.3+版本中,类只有一个构造方法时,参数会自动从Spring容器注入,不需要额外加@Autowired - 给
drMessage字段加final修饰或者@NonNull注解,lombok自动生成的构造方法会自动把drMessage加入构造参数,你实例化时直接传入即可
示例代码:
@RequiredArgsConstructor @Service public class ServiceImpl implements IService { private final DtoMapper dtoMapper; private final CDtoMapper cDtoMapper; private final DrMessage drMessage; // 其他代码 }
方案2:需要自定义构造逻辑,手动编写构造方法
- 先移除类上的
@RequiredArgsConstructor注解 - 手动编写全参数构造方法,两个Mapper参数由Spring自动注入,
drMessage由你自己传入赋值
示例代码:
@Service public class ServiceImpl implements IService { private final DtoMapper dtoMapper; private final CDtoMapper cDtoMapper; private DrMessage drMessage; // 手动写构造方法,两个Mapper会被Spring自动注入,drMessage你实例化时自己传参 public ServiceImpl(DtoMapper dtoMapper, CDtoMapper cDtoMapper, DrMessage drMessage) { this.dtoMapper = dtoMapper; this.cDtoMapper = cDtoMapper; this.drMessage = drMessage; } // 其他代码 }
注意事项
- 默认
@Service标记的类是Spring单例Bean,如果你需要每次传入不同的drMessage实例化,需要给类加@Scope("prototype")注解声明为原型模式,同时通过ApplicationContext的getBean(Class<T> requiredType, Object... args)方法传入drMessage创建实例,不要直接new,否则Bean不受Spring管理,Mapper字段会注入失败。
内容的提问来源于stack exchange,提问作者Jhon
相关产品推荐
相关产品推荐

