SpringBoot优雅编码之:Lombok加持


概述

Lombok 经过提供简单的语法注解形式来帮助简化消除一些必须有但显得很臃肿的 java 代码。典型的是对于 POJO对象的简化(如自动帮咱们生成Setter和Getter等),有了Lombok的加持,开发人员能够免去不少重复且臃肿的操做,极大地提升java代码的信噪比,所以咱们必须尝试并应用起来!java

注: 本文首发于 My 公众号 CodeSheep ,可 长按扫描 下面的 当心心 来订阅 ↓ ↓ ↓git

CodeSheep · 程序羊


IntelliJ IDEA上配置

方法一:直接在IDEA界面中配置github

  • 首先进入Plugins界面:

进入Plugins界面

  • 而后搜索并安装Lombok插件:

安装Lombok插件

  • 最后不要忘了开启Annotation Processors的Enable选项:

Enable Annotation Processors

上述安装完成之后须要重启IDEA生效!编程


方法二:手动下载Lombok插件安装c#

有时因为网络缘由,上面方法一这种方式安装失败,所以只能手动下载安装bash

  • 下载lombok插件: https://github.com/mplushnikov/lombok-intellij-plugin/releases服务器

  • Plugins -> Install plugin from disk... 选择下载的zip包安装网络

选择lombok的zip包来安装

  • 重启idea便可

重启IDEA生效

IDE中设置完成之后须要在pom.xml中添加以下所示的lombok依赖才能使用app

<dependency>
	<groupId>org.projectlombok</groupId>
	<artifactId>lombok</artifactId>
	<version>1.16.16</version>
</dependency>
复制代码

Lombok主要注解

  • @Getter and @Setter / 自动为属性提供 Set和Get 方法
  • @ToString / 该注解的做用是为类自动生成toString()方法
  • @EqualsAndHashCode / 为对象字段自动生成hashCode和equals实现
  • @AllArgsConstructor, @RequiredArgsConstructor and @NoArgsConstructor / 顾名思义,为类自动生成对应参数的constructor
  • @Log, @Log4j, @Log4j2, @Slf4j, @XSlf4j, @CommonsLog, @JBossLog / 自动为类添加对应的log支持
  • @Data / 自动为全部字段添加@ToString, @EqualsAndHashCode, @Getter,为非final字段添加@Setter,和@RequiredArgsConstructor,本质上至关于几个注解的综合效果
  • @NonNull / 自动帮助咱们避免空指针。做用在方法参数上的注解,用于自动生成空值参数检查
  • @Cleanup / 自动帮咱们调用close()方法。做用在局部变量上,在做用域结束时会自动调用close方法释放资源

下文就Lombok中用的最为频繁的@Data@Log注解进行代码实战!框架


@Data注解使用

官网关于@Data注解的解释以下:

All together now: A shortcut for @ToString, @EqualsAndHashCode, @Getter on all fields, @Setter on all non-final fields, and @RequiredArgsConstructor!

不难理解,其能够当作是多个Lombok注解的集成,所以使用很方便!

  • 先来建立一个POJO实体UserLombok,普通的写法以下:
public class UserLombok {
  private final String name;
  private int age;
  private double score;
  private String[] tags;
  
  public UserLombok(String name) {
    this.name = name;
  }
  
  public String getName() {
    return this.name;
  }
  
  void setAge(int age) {
    this.age = age;
  }
  
  public int getAge() {
    return this.age;
  }
  
  public void setScore(double score) {
    this.score = score;
  }
  
  public double getScore() {
    return this.score;
  }
  
  public String[] getTags() {
    return this.tags;
  }
  
  public void setTags(String[] tags) {
    this.tags = tags;
  }
  
  @Override public String toString() {
    return "DataExample(" + this.getName() + ", " + this.getAge() + ", " + this.getScore() + ", " + Arrays.deepToString(this.getTags()) + “)”;
  }
  
  protected boolean canEqual(Object other) {
    return other instanceof DataExample;
  }
  
  @Override public boolean equals(Object o) {
    if (o == this) return true;
    if (!(o instanceof DataExample)) return false;
    DataExample other = (DataExample) o;
    if (!other.canEqual((Object)this)) return false;
    if (this.getName() == null ? other.getName() != null : !this.getName().equals(other.getName())) return false;
    if (this.getAge() != other.getAge()) return false;
    if (Double.compare(this.getScore(), other.getScore()) != 0) return false;
    if (!Arrays.deepEquals(this.getTags(), other.getTags())) return false;
    return true;
  }
  
  @Override public int hashCode() {
    final int PRIME = 59;
    int result = 1;
    final long temp1 = Double.doubleToLongBits(this.getScore());
    result = (result*PRIME) + (this.getName() == null ? 43 : this.getName().hashCode());
    result = (result*PRIME) + this.getAge();
    result = (result*PRIME) + (int)(temp1 ^ (temp1 >>> 32));
    result = (result*PRIME) + Arrays.deepHashCode(this.getTags());
    return result;
  }
}
复制代码
  • Lombok加持后,写法可简化为:
@Data
public class UserLombok {
    private final String name;
    private int age;
    private double score;
    private String[] tags;
}
复制代码

在IDEA中使用时,Lombok的注解会自动补全,以下图所示:

Lombok注解自动补全

  • 咱们来写POJO的测试代码
public static void main( String[] args ) {
        UserLombok userLombok = new UserLombok("hansonwang99”); userLombok.setAge(18); String[] array = new String[]{"apple","juice”};
        userLombok.setTags( array );
        userLombok.setScore( 99.0 );
        System.out.println(userLombok);
    }
复制代码

由下图咱们能够看到IDEA依然能够自动为咱们补全由Lombok自动生成的代码:

自动生成的代码

  • 结果打印

因为Lombok为咱们自动生成了toString方法,所以对象的打印结果以下:

UserLombok(name=hansonwang99, age=18, score=99.0, tags=[apple, juice])
复制代码

@Log注解实战

在个人文章 Spring Boot日志框架实践 一文中,咱们使用Log4j2来做为日志对象,其写法以下:

@RestController
@RequestMapping("/testlogging”) public class LoggingTestController { private final Logger logger = LogManager.getLogger(this.getClass()); @GetMapping("/hello”)
    public String hello() {
        for(int i=0;i<10_0000;i++){
            logger.info("info execute index method”); logger.warn("warn execute index method”);
            logger.error("error execute index method”); } return "My First SpringBoot Application”;
    }
}
复制代码

若改用Lombok后,写法变得更加简洁,咱们只须要引入对应的@Log注解便可完成log对象的生成:

@RestController
@RequestMapping("/testloggingwithlombok”) @Log4j2 public class LoggingTestControllerLombok { @GetMapping("/hello”)
    public String hello() {
        for(int i=0;i<10_0000;i++){
            log.info("info execute index method”); log.warn("warn execute index method”);
            log.error("error execute index method”); } return "My First SpringBoot Application”;
    }
}
复制代码

怎么样,是否是一切都是那么地优雅!


后记

做者更多的SpringBt实践文章在此:


若是有兴趣,也能够抽点时间看看做者一些关于容器化、微服务化方面的文章:


CodeSheep · 程序羊
相关文章
相关标签/搜索