【基础篇】SpringBoot 妙用 lombok 使代码更加优雅

256 阅读3分钟

写在最前

ProjectLombok 是一个 Java 库,可以自动插入到编辑器和构建工具中,提高java的性能。--来自 Lombok 官网

本文在【基础篇】SpringBoot 配置文件详解代码基础上使用 lombok 优化代码!

代码地址

mingyue-springboot-base-lombok

IDEA 安装 Lombok 插件

参考IDEA常用插件推荐安装插件的方式安装 Lombok 插件(IDEA 高版本已经默认安装了 Lombok 插件)。

项目也需要引入依赖

<!--lombok依赖-->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

Lombok 妙用

@Data

替换 get/set 方法

// 原代码
@Component
@ConfigurationProperties(prefix = "mingyue")
public class MingYueUserProperties {
  private Long id;
  private String name;
  private String sex;

  public Long getId() {
    return id;
  }

  public void setId(Long id) {
    this.id = id;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public String getSex() {
    return sex;
  }

  public void setSex(String sex) {
    this.sex = sex;
  }

  @Override
  public String toString() {
    return "MingYueUserProperties{"
        + "id="
        + id
        + ", name='"
        + name
        + '\''
        + ", sex='"
        + sex
        + '\''
        + '}';
  }
}

// Lombok 介入的代码
@Data
@Component
@ConfigurationProperties(prefix = "mingyue")
public class MingYueUserProperties {
  private Long id;
  private String name;
  private String sex;

  @Override
  public String toString() {
    return "MingYueUserProperties{"
        + "id="
        + id
        + ", name='"
        + name
        + '\''
        + ", sex='"
        + sex
        + '\''
        + '}';
  }
}

启动项目验证接口数据是否正确:http://localhost:8090/mingYue

@ToString

替换 toString 方法

// 原代码
@Data
@Component
@ConfigurationProperties(prefix = "mingyue")
public class MingYueUserProperties {
  private Long id;
  private String name;
  private String sex;

  @Override
  public String toString() {
    return "MingYueUserProperties{"
        + "id="
        + id
        + ", name='"
        + name
        + '\''
        + ", sex='"
        + sex
        + '\''
        + '}';
  }
}

// Lombok 介入的代码
@Data
@ToString
@Component
@ConfigurationProperties(prefix = "mingyue")
public class MingYueUserProperties {
  private Long id;
  private String name;
  private String sex;
}

启动项目验证接口数据是否正确:http://localhost:8090/mingYue

@SneakyThrows

异常处理

// 原代码
@GetMapping("/mingYue")
public String mingYue(Integer type) throws Exception {
    log.info("==== into mingYue api ====");

    if (type == 0) {
        throw new Exception("type 等于 0");
    }

    return mingYueUserProperties.toString();
}

// Lombok 介入的代码
@GetMapping("/mingYue")
@SneakyThrows
public String mingYue(Integer type) {
    log.info("==== into mingYue api ====");

    if (type == 0) {
        throw new Exception("type 等于 0");
    }

    return mingYueUserProperties.toString();
}

启动项目验证接口数据是否正确:http://localhost:8090/mingYue

@RequiredArgsConstructor

替代 @Autowired 构造注入,多个 bean 注入时更加清晰,只会构造注入 final 注释的属性

// 原代码
@RestController
public class MingYueController {

  private static final Logger log = LoggerFactory.getLogger(MingYueController.class);

  @Autowired private MingYueUserProperties mingYueUserProperties;

  @GetMapping("/mingYue")
  public String mingYue() {
    log.info("==== into mingYue api ====");
    return mingYueUserProperties.toString();
  }
}

// Lombok 介入的代码
@RestController
@RequiredArgsConstructor
public class MingYueController {

  private static final Logger log = LoggerFactory.getLogger(MingYueController.class);

  private final MingYueUserProperties mingYueUserProperties;

  @GetMapping("/mingYue")
  public String mingYue() {
    log.info("==== into mingYue api ====");
    return mingYueUserProperties.toString();
  }
}

启动项目验证接口数据是否正确:http://localhost:8090/mingYue

@Cleanup

清理流对象,不用手动去关闭流

// 原代码
@SneakyThrows
public void useCleanUp() {
    String inStr = "Ming Yue!";
    ByteArrayInputStream in = new ByteArrayInputStream(inStr.getBytes("UTF-8"));
    ByteArrayOutputStream out = new ByteArrayOutputStream();

    byte[] b = new byte[1024];
    while (true) {
        int r = in.read(b);
        if (r == -1) {
            break;
        }
        out.write(b, 0, r);
    }
    String outStr = out.toString("UTF-8");
    System.out.println(outStr);

    // 手动清理
    out.close();
    in.close();
}

// Lombok 介入的代码
@SneakyThrows
public void useCleanUpNew() {
    String inStr = "Ming Yue!";

    // 使用输入输出流自动关闭
    @Cleanup ByteArrayInputStream in = new ByteArrayInputStream(inStr.getBytes("UTF-8"));
    @Cleanup ByteArrayOutputStream out = new ByteArrayOutputStream();

    byte[] b = new byte[1024];
    while (true) {
        int r = in.read(b);
        if (r == -1) {
            break;
        }
        out.write(b, 0, r);
    }
    String outStr = out.toString("UTF-8");
    System.out.println(outStr);
}

@XxConstructor

@XxConstructor注解可以自动生成构造方法:

  • @NoArgsConstructor:生成无参构造函数;
  • @AllArgsConstructor:生成包含所有参数的构造函数;

@Builder

可以通过建造者模式来创建对象,建造者模式加链式调用

@Data
@ToString
@Component
@Builder
@AllArgsConstructor
@NoArgsConstructor
@ConfigurationProperties(prefix = "mingyue")
public class MingYueUserProperties {
  private Long id;
  private String name;
  private String sex;

  public static void main(String[] args) {
    MingYueUserProperties example =
        MingYueUserProperties.builder().id(2L).name("Strive").sex("男").build();
    System.out.println(example);
  }
}

@Slf4j

Lombok 生成日志对象,直接生成日志对象 log

// 原代码
@RestController
@RequiredArgsConstructor
public class MingYueController {

  private final MingYueUserProperties mingYueUserProperties;

  // 手动声明日志对象
  private static final Logger log = LoggerFactory.getLogger(MingYueController.class);

  @GetMapping("/mingYue")
  @SneakyThrows
  public String mingYue(Integer type) {
    log.info("==== into mingYue api ====");

    if (null != type && type == 0) {
      throw new Exception("type 等于 0");
    }

    return mingYueUserProperties.toString();
  }
}

// Lombok 介入的代码
@Slf4j
@RestController
@RequiredArgsConstructor
public class MingYueController {

  private final MingYueUserProperties mingYueUserProperties;

  @GetMapping("/mingYue")
  @SneakyThrows
  public String mingYue(Integer type) {
    // 直接使用日志对象
    log.info("==== into mingYue api ====");

    if (null != type && type == 0) {
      throw new Exception("type 等于 0");
    }

    return mingYueUserProperties.toString();
  }
}

启动项目验证接口数据是否正确:http://localhost:8090/mingYue,日志输出如下:

INFO 1356 --- [nio-8090-exec-3] c.c.m.b.l.controller.MingYueController   : ==== into mingYue api ====

实现原理

target 目录瞅一瞅对应的 class 文件就知道啦~~~