Lombok常用注解总结

@RequiredArgsConstructor注解

1.示例

在类上添加@RequiredArgsConstructor注解,Lombok会自动生成一个构造函数 ,该构造函数包含类中所有final字段和被@NonNull注解标注的字段。示例如下:

java 复制代码
import lombok.NonNull;
import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
public class User {
    private final Long id;
    @NonNull
    private String name;
    private Integer age; // 普通字段不会出现在构造函数中
}

上面的代码经过编译后,会生成如下构造函数:

java 复制代码
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的构造函数注入。

示例:

java 复制代码
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class UserService {
    private final UserRepository userRepository; // final字段
    private final EmailService emailService;    // final字段
}

编译之后,会生成如下构造函数:

java 复制代码
@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 能够自动识别并完成依赖注入。例如:

java 复制代码
@Service
@RequiredArgsConstructor // 生成唯一的构造函数
public class UserService {
   private final UserRepository userRepository;
}

上面的代码在编译之后会生成如下构造函数:

java 复制代码
public UserService(UserRepository userRepository) {
   this.userRepository = userRepository;
}

此时,Spring 会自动注入 UserRepository,无需添加 @Autowired
存在多个构造函数时需要显式使用 @Autowired

当类中存在多个构造函数,并且你希望 Spring 使用特定的构造函数时,就需要显式添加 >@Autowired 注解。示例如下:

java 复制代码
@Service
@RequiredArgsConstructor // 生成构造函数1
public class UserService {
   private final UserRepository userRepository;
   
   @Autowired // 显式指定使用这个构造函数
   public UserService(UserRepository userRepository, OtherService otherService) {
       this.userRepository = userRepository;
       // 其他逻辑
   }
}
注意事项
  1. final字段必须初始化 :如果类中有final字段,那么这些字段必须在构造函数中进行初始化,否>则会出现编译错误。
  2. 避免与@AllArgsConstructor同时使用@RequiredArgsConstructor@AllArgsConstructor都用>于生成构造函数,同时使用可能会造成冲突。
  3. 静态字段被忽略:静态字段不会参与构造函数的生成。
  4. 参数顺序:构造函数中参数的顺序和类中字段的声明顺序是一致的。
相关推荐
whltaoin2 小时前
【Java SE】Java IO体系深度剖析:从原理到实战的全方位讲解(包含流操作、序列化与 NIO 优化技巧)
java·开发语言·nio·se·io体系
Tony Bai8 小时前
Go 安全新提案:runtime/secret 能否终结密钥残留的噩梦?
java·开发语言·jvm·安全·golang
oioihoii8 小时前
C++11到C++23语法糖万字详解
java·c++·c++23
pengzhuofan8 小时前
Java演进与与工程师成长
java·开发语言
月明长歌8 小时前
再谈Java 继承与多态:从“能用”到“精通”,更深一层的原理与设计思维
java·开发语言
狗头实习生8 小时前
Spring常见的事务失效原因
java·数据库·spring
想个名字太难9 小时前
网络爬虫入门程序
java·爬虫·maven
diudiu_3310 小时前
web漏洞--认证缺陷
java·前端·网络
heartbeat..10 小时前
注解 + 反射:Web 项目 Excel 一键导出工具 EnhancedExportExcelUtil 详解
java·excel·poi
lkbhua莱克瓦2410 小时前
IO流练习(加密和解密文件)
java·开发语言·笔记·学习方法·io流·io流练习题