Lombok常用注解总结

@RequiredArgsConstructor注解

1.示例

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

import lombok.NonNull;
import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
public class User {
    private final Long id;
    @NonNull
    private 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;
       // 其他逻辑
   }
}
注意事项
  1. final字段必须初始化:如果类中有final字段,那么这些字段必须在构造函数中进行初始化,否>则会出现编译错误。
  2. 避免与@AllArgsConstructor同时使用@RequiredArgsConstructor@AllArgsConstructor都用>于生成构造函数,同时使用可能会造成冲突。
  3. 静态字段被忽略:静态字段不会参与构造函数的生成。
  4. 参数顺序:构造函数中参数的顺序和类中字段的声明顺序是一致的。
### Lombok 注解的使用方法及常见问题 #### 一、Lombok 基本概念 Lombok 是一种 Java 库,通过注解简化开发流程并减少样板代码。它可以在编译期间自动生成 getter/setter 方法、构造器以及其他常用功能。 --- #### 二、核心注解及其作用 1. **`@Getter` 和 `@Setter`** - 自动为类中的字段生成 Getter 或 Setter 方法。 - 对于布尔类型的字段,如果其数据类型是 `boolean`,则会生成以 `is` 开头的方法;如果是 `Boolean` 类型,则生成以 `get` 开头的方法[^3]。 ```java import lombok.Getter; import lombok.Setter; public class Example { @Getter @Setter private String name; @Getter private boolean active; // 自动生成 isActive() @Getter private Boolean visible; // 自动生成 getVisible() } ``` 2. **`@NoArgsConstructor`, `@AllArgsConstructor`, `@RequiredArgsConstructor`** - 自动生成无参构造器 (`@NoArgsConstructor`)、全参构造器 (`@AllArgsConstructor`) 或仅含 final 字段的构造器 (`@RequiredArgsConstructor`)。 ```java import lombok.NoArgsConstructor; import lombok.AllArgsConstructor; import lombok.RequiredArgsConstructor; @NoArgsConstructor @AllArgsConstructor @RequiredArgsConstructor public class ConstructorExample { private int id; private final String name; } ``` 3. **`@ToString`** - 自动生成 `toString()` 方法,默认情况下包含所有非静态字段。 - 可配置忽略某些字段或调用父类的 `toString()` 方法。 ```java import lombok.ToString; @ToString(exclude = "password") // 排除 password 字段 public class ToStringExample { private String username; private String password; } ``` 4. **`@EqualsAndHashCode`** - 自动生成 `equals()` 和 `hashCode()` 方法。 - 配置项 `callSuper=true` 表示继承父类的实现逻辑;默认值 `false` 则只基于当前类的字段计算哈希码和相等性判断[^4]。 ```java import lombok.EqualsAndHashCode; @EqualsAndHashCode(callSuper = true) public class EqualsAndHashCodeExample extends ParentClass { private String fieldA; private int fieldB; } ``` 5. **`@NonNull`** - 在方法或构造函数中自动插入空值检查,并抛出带有参数名称的消息的 `NullPointerException`[^1]。 ```java import lombok.NonNull; public class NonNullExample { public void setField(@NonNull String value) { this.field = value; } private String field; } ``` 6. **`@Builder`** - 提供流畅的构建模式支持,允许创建复杂的对象实例而无需多个重载构造器[^2]。 ```java import lombok.Builder; @Builder public class BuilderExample { private String name; private int age; public static void main(String[] args) { BuilderExample example = BuilderExample.builder() .name("John Doe") .age(30) .build(); } } ``` 7. **其他常用注解** - `@Data`: 组合了 `@Getter`, `@Setter`, `@ToString`, `@EqualsAndHashCode` 和 `@RequiredArgsConstructor` 功能。 - `@Slf4j`: 自动生成日志记录工具 Logger 实例。 - `@Cleanup`: 自动管理资源关闭操作。 --- #### 三、常见问题及解决方案 1. **关于布尔类型字段的命名冲突** - 如果定义了一个 `private boolean flag` 的字段,在使用 `@Getter` 后会生成名为 `isFlag()` 的方法;但如果将其改为包装类型 `Boolean`,则会生成 `getFlag()` 方法。这种差异可能导致混淆,因此建议统一字段的数据类型。 2. **IDE 支持不足** - 若 IDE 中未正确显示由 Lombok 生成的方法或属性,需安装对应的插件(如 IntelliJ IDEA 的 Lombok 插件),并确保项目已引入 Lombok 依赖库。 3. **调试困难** - 调试过程中无法查看 Lombok 扩展的内容时,可以通过启用 `-d` 参数来观察实际生成的字节码文件。 4. **与其他框架集成问题** - 某些序列化框架可能不兼容 Lombok 默认行为(例如 Jackson)。此时可通过显式指定访问级别或其他方式调整适配关系。 --- #### 四、总结 Lombok 大大减少了手动编写重复代码的工作量,提高了生产力。然而,在享受便利的同时也需要注意潜在的风险以及团队协作的一致性需求。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值