Lombok常用注解总结
@RequiredArgsConstructor注解
1.示例
在类上添加@RequiredArgsConstructor
注解,Lombok会自动生成一个构造函数,该构造函数包含类中所有final
字段和被@NonNull
注解标注的字段。示例如下:
import lombok.NonNull;
import lombok.RequiredArgsConstructor;@RequiredArgsConstructor
public class User {private final Long id;@NonNullprivate String name;private Integer age; // 普通字段不会出现在构造函数中
}
上面的代码经过编译后,会生成如下构造函数:
public User(Long id, @NonNull String name) {if (name == null) {throw new NullPointerException("name is marked non-null but is null");}this.id = id;this.name = name;
}
2.用于Spring Bean的构造函数注入
@RequiredArgsConstructor
常常和@Autowired
一起使用,以此实现Spring Bean的构造函数注入。
示例:
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;@Service
@RequiredArgsConstructor
public class UserService {private final UserRepository userRepository; // final字段private final EmailService emailService; // final字段
}
编译之后,会生成如下构造函数:
@Service
public class UserService {private final UserRepository userRepository;private final EmailService emailService;public UserService(UserRepository userRepository, EmailService emailService) {this.userRepository = userRepository;this.emailService = emailService;}
}
Spring 4.3 之后无需显式使用
@Autowired
在 Spring 4.3 及后续版本中,如果一个类只有唯一的构造函数,那么这个构造函数的 >@Autowired
注解是可以省略的。Spring 能够自动识别并完成依赖注入。例如:@Service @RequiredArgsConstructor // 生成唯一的构造函数 public class UserService {private final UserRepository userRepository; }
上面的代码在编译之后会生成如下构造函数:
public UserService(UserRepository userRepository) {this.userRepository = userRepository; }
此时,Spring 会自动注入
UserRepository
,无需添加@Autowired
。
存在多个构造函数时需要显式使用@Autowired
当类中存在多个构造函数,并且你希望 Spring 使用特定的构造函数时,就需要显式添加 >@Autowired
注解。示例如下:@Service @RequiredArgsConstructor // 生成构造函数1 public class UserService {private final UserRepository userRepository;@Autowired // 显式指定使用这个构造函数public UserService(UserRepository userRepository, OtherService otherService) {this.userRepository = userRepository;// 其他逻辑} }
注意事项
- final字段必须初始化:如果类中有
final
字段,那么这些字段必须在构造函数中进行初始化,否>则会出现编译错误。 - 避免与@AllArgsConstructor同时使用:
@RequiredArgsConstructor
和@AllArgsConstructor
都用>于生成构造函数,同时使用可能会造成冲突。 - 静态字段被忽略:静态字段不会参与构造函数的生成。
- 参数顺序:构造函数中参数的顺序和类中字段的声明顺序是一致的。