Fork me on GitHub

你每天写的POJO够优雅么?

目录

1. 引言

本文的灵感来自于前段时间参加的一个CodeReview,在那场CodeReview中,我强忍着破口大骂的冲动“你的POJO竟然还要写几十行无用的get、set。。。”,“你竟然还要每个POJO都要自己手动去写toString。。。”,“你每个类打印日志竟然还要自己先声明。。。”。接近尾声的时候,我提了一下“你可以试着使用一下LomBok”。

首先澄清一点,我不是看不起那些使用IDE工具自动生成get、set、toString方法的人,每个类还要自己去写Log的人,我只是觉得有更好的解决方案,为什么不试着拥抱一下呢?

2. 配置

先创建一个最简单的springboot的项目

2.1 添加依赖

Lombok的使用相当的简单,maven项目只需要添加一个依赖包就ok,其他项目请各自百度搞定。

<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.8</version>
    <scope>provided</scope>
</dependency>

这个应该是目前最新版的,看maven仓库的记录是2019年5月份新鲜出炉的。

2.2 添加idea对Lombok的支持

手边只有idea,想要了解ecplise如何使用的童鞋,可以自行百度解决,或者给我留言。

点击File->Plugins,输入搜索Lombok,因为我这边已经已经安装过了,所需显示的灰色的

点击File->Settings设置界面,开启Annocation Processors,如下图:

一般来说,安装好之后,都会自动配置的,如果未生效,可以检查一下这里。

2.3 Lombok实现原理

Lombok实现了JSR 269 API规范,javac在Java6开始支持这一规范,只要程序实现了该API,就能在javac运行的时候得到调用,那么Lombok在编译时使用的就是javac,具体流程如下:

首先是项目的源代码文件,在经过编译处理以后,lombok会使用自己的抽象语法树去进行注解的匹配,如果在项目中的某一个类中使用了lombok中的注解,那么注解编译器就会自动去匹配项目中的注解对应到在lombok语法树中的注解文件,并经过自动编译匹配来生成对应类中的getter或者setter方法,达到简化代码的目的。执行顺序就如上图的叠放顺序。

3. Lombok主要常用的注解有:

@Data, @getter, @setter, @NoArgsConstructor, @AllArgsConstructor, @ToString, @EqualsAndHashCode, @Slf4j, @Log4j。我们一个一个来看:

  • @Data注解 :在JavaBean或类JavaBean中使用,这个注解包含范围最广,它包含@ToString @EqualsAndHashCode @Getter @Setter @RequiredArgsConstructor,即当使用当前注解时,会自动生成包含的所有方法,这个也是在POJO类上最常用的注解,一般一个POJO类,如果没有什么特殊需求,直接标记一个这个注解就够了。
package com.springboot.lombok.model;

import lombok.Data;

/**
 * Created with IntelliJ IDEA.
 *
 * @email: inwsy@hotmail.com
 * Description:
 */
@Data
public class TestModel {
    private String id;
    private int age;
    private boolean isMan;
}

我们可以看一下Structure视图:

这里我们已经可以看到对应的get、set和对应的无参构造方法了。

  • @getter注解 :在JavaBean或类JavaBean中使用,使用此注解会生成对应的getter方法;

  • @setter注解 :在JavaBean或类JavaBean中使用,使用此注解会生成对应的setter方法;

@NoArgsConstructor注解 :在JavaBean或类JavaBean中使用,使用此注解会生成对应的无参构造方法;

  • @RequiredArgsConstructor :生成包含final和@NonNull注解的成员变量的构造器;

  • @AllArgsConstructor注解 :在JavaBean或类JavaBean中使用,使用此注解会生成对应的有参构造方法;

  • @ToString注解 :在JavaBean或类JavaBean中使用,使用此注解会自动重写对应的toStirng方法;

  • @EqualsAndHashCode注解 :在JavaBean或类JavaBean中使用,使用此注解会自动重写对应的equals方法和hashCode方法;

  • @Slf4j :在需要打印日志的类中使用,当项目中使用了slf4j打印日志框架时使用该注解,会简化日志的打印流程,只需调用info方法即可,常用方法,sfl4j是log的装饰类,在需要打印日志的类加一个这个这注解,下面的代码就可以直接log.info();

如图,并无编译错误。

  • @Log4j :在需要打印日志的类中使用,当项目中使用了log4j打印日志框架时使用该注解,会简化日志的打印流程,只需调用info方法即可,如果项目中规定使用的log类为Log4j,则可以使用这个注解;

4. 其他重要注解

  • @Cleanup :自动关闭资源,针对实现了java.io.Closeable接口的对象有效,如:典型的IO流对象

编译后的代码:

  • @SneakyThrows:可以对受检异常进行捕捉并抛出,可以改写上述的ioTest方法如下:

  • @Synchronized:作用于方法级别,可以替换synchronize关键字或lock锁,用处不大。

Github-实例代码

相关文章

评论系统未开启,无法评论!