You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何向使用@RequiredArgsConstructor注解的类构造方法传递参数

问题解决方案

首先明确两个核心误区:

  1. @RequiredArgsConstructor 不会生成无参构造方法,只会为类中未赋值的final字段、标记@NonNull的字段生成带对应参数的构造方法
  2. 你给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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 14:48:02