在Spring Boot项目中,选择使用 @AllArgsConstructor 还是 @RequiredArgsConstructor 这两个注解都是 Lombok 库提供的,用于简化构造函数的创建。
区别:
1. @AllArgsConstructor 会在类上生成一个包含所有非静态、非 final 字段的构造函数。这意味着,如果你的类中有多个字段,并且希望在构造函数中初始化所有这些字段,那么可以使用 @AllArgsConstructor。
示例:
@RestController
@AllArgsConstructor
@Api(tags = "APP/接口版本更新",description = "")
public class SysVersionCtrl extends BaseFragment {
ISystemVersionService service;
}
2. @RequiredArgsConstructor 会在类上生成一个包含所有被标记为 final 或声明为 private 的字段的构造函数。这意味着只有那些不可变或私有的字段才会被包含在构造函数中。这通常用于依赖注入场景,特别是当某些字段是必须的,并且希望在构造时就提供这些依赖时。
示例:
@Slf4j
@RestController
@RequiredArgsConstructor
@RequestMapping("/user")
@Api(tags="用户服务",description = "")
public class SysUserPullCtrl extends ApiFrag {
final ISysUserPullService userPullService;
final ISysUserService userservice;
}
其它:
@AllArgsConstructor 和 @RequiredArgsConstructor 不适合用来注入由 @Value 注解绑定的值,因为这些值通常是在运行时动态解析的,并且不是作为构造函数的参数注入。如果你需要在构造函数中初始化这些值,可以考虑使用 @Configuration 类结合 @Bean 方法的方式,或者直接在类中使用 @Value 注解来实现。
示例:
@Data
@Component
@ConfigurationProperties(prefix = "custom")
public class CustomProperties {
private Boolean loginfo=true;
private Boolean sms=false;
private String code;
}
@Slf4j
@RestController
@RequiredArgsConstructor
@RequestMapping("/user")
@Api(tags="用户服务",description = "")
public class SysUserPullCtrl extends ApiFrag {
final ISysUserPullService userPullService;
final ISysUserService userservice;
final CustomProperties custProperties;
}
总结:
在大多数情况下,@RequiredArgsConstructor 是更好的选择,因为它仅生成必要的构造函数,减少了不必要的代码,并且保持了依赖关系的清晰性。这也有助于遵循最小必要原则,使得代码更加简洁和易于维护。