如何使用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
相关产品推荐
相关产品推荐

