浅谈Lombok中三个实用注解
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
在 Spring 的组件(如 @Service
、@Controller
、@Component
、@Repository
等)中使用 @RequiredArgsConstructor(onConstructor = @__(@Autowired))
,可以让Lombok在生成构造函数时也加上 @Autowired
注解,这样,Spring 就可以自动注入所需的依赖。也符合现在spring推荐的构造函数注入方式
例如:
@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class UserServiceImpl implements UserService {
private final UserMapper userMapper;
}
Lombok 会生成以下代码:
@Service
public class UserServiceImpl implements UserService {
private final UserMapper userMapper;
@Autowired
public MyService(UserMapper userMapper) {
this.userMapper = userMapper;
}
}
从生成的代码中可以看出:
-
为
UserServiceImpl
生成了一个构造函数,该构造函数接受一个UserMapper
类型的参数。 -
由于构造函数上有
@Autowired
注解,Spring 会自动查找合适的UserMapper
bean 实例并注入到UserServiceImpl
中。
这种方式结合了 Lombok 的自动代码生成功能和 Spring 的依赖注入功能,使得代码更为简洁
@Singular 和 @Builder 组合
@Builder
让你的类支持链式构造,而@Singular
让集合类型字段可以更方便的维护。
@Singular
注解可以用在集合类型的字段上,它会生成两个方法,一个是添加单个元素的方法,一个是添加整个集合的方法。这两个方法可以和 @Builder
生成的其他方法一起链式调用,给你的类的所有字段赋值。
这么讲可能有点懵,直接看示例:
@Data
@Builder
public class User {
private String name;
private Integer age;
@Singular
private List<String> hobbies;
}
使用 @Builder 和 @Singular 生成的方法
User user = User.builder()
.name("张三")
.age(18)
.hobby("足球") // 添加单个元素
.hobby("乒乓球") // 添加单个元素
.hobbies(Arrays.asList("打游戏", "打羽毛球")) // 添加整个集合
.build(); // 构造 User 对象
使用 @Singular
注解,可以灵活地添加集合类型的字段,不需要创建和初始化集合对象。
另外,使用 @Singular
注解生成的集合字段,在调用 build()
方法后,会被转换为不可变的集合,这样可以保证对象的不变性和线程安全性。也可以使用 clear()
方法来清空集合字段,例如:
User user = User.builder()
.name("李四")
.age(18)
.hobby("足球")
.hobby("乒乓球")
.clearHobbies() // 清空集合字段
.hobby("打游戏") // 重新添加元素
.build();
注意:如果这个类继承了一个类,那么 @Builder
只会生成当前类的字段和参数,不包括父类的。