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

导读:本篇文章讲解 【基础篇】SpringBoot 妙用 lombok 使代码更加优雅,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

写在最前

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 文件就知道啦~~~

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由半码博客整理,本文链接:https://www.bmabk.com/index.php/post/78351.html

(0)
小半的头像小半

相关推荐

半码博客——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!