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

如何使用Lombok@RequiredArgsConstructor实现依赖注入下的自定义字段初始化?

用Lombok优化带依赖初始化字段的Controller代码

直接用@RequiredArgsConstructor没法完全自动处理你的场景——因为registerCount的初始化需要调用注入的collectorRegistry的方法,而Lombok自动生成的构造器只会给final字段直接赋值,不会处理这种自定义的初始化逻辑。不过可以通过以下两种方式结合Lombok来优化:

方案1:结合Lombok生成的构造器,手动补全自定义初始化

给类加上@RequiredArgsConstructor,让Lombok自动生成userService和userDetailsService的赋值逻辑,然后手动编写包含collectorRegistry的构造器,复用Lombok生成的构造器来减少重复代码:

@RestController
@RequestMapping("/api/user")
@RequiredArgsConstructor
public class UserController {

    private final UserService userService;
    private final UserDetailsService userDetailsService;
    private final Counter registerCount;

    // 手动构造器,调用Lombok生成的构造器处理基础字段,再初始化registerCount
    public UserController(UserService userService, UserDetailsService userDetailsService, CollectorRegistry collectorRegistry) {
        this(userService, userDetailsService);
        registerCount = Counter.build()
                .name("register_count")
                .labelNames("domain_name", "domain_id")
                .help("Number of registrations")
                .register(collectorRegistry);
    }
}

方案2:用实例初始化块配合@RequiredArgsConstructor

把collectorRegistry也声明为final字段,让@RequiredArgsConstructor生成包含所有字段的构造器,然后用实例初始化块来完成registerCount的初始化——Java的实例初始化块会在构造器执行阶段运行,此时collectorRegistry已经被注入:

@RestController
@RequestMapping("/api/user")
@RequiredArgsConstructor
public class UserController {

    private final UserService userService;
    private final UserDetailsService userDetailsService;
    private final CollectorRegistry collectorRegistry;
    private final Counter registerCount;

    // 实例初始化块,在构造器赋值后执行
    {
        registerCount = Counter.build()
                .name("register_count")
                .labelNames("domain_name", "domain_id")
                .help("Number of registrations")
                .register(collectorRegistry);
    }
}

两种方案各有优劣:方案1逻辑更直观,不需要依赖字段顺序;方案2完全不用手动写构造器,但要注意初始化块的执行时机和字段声明顺序(确保collectorRegistry在registerCount之前声明)。

内容的提问来源于stack exchange,提问作者TomDoes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 20:06:31