前言Java应用程序中有很多重复和相似的代码,生成后几乎没有变化,但我们仍然要花很多精力来编写它们以满足Java的编译要求。例如,在Java应用程序开发中,我们几乎都要为所有的Bean成员变量添加get()、set()等方法。这些相对固定但又必不可少的代码浪费了程序员大量的精力,同时也让类内容看起来更加Clutter,我们要将有限的精力放在更重要的地方。Lombok诞生很久了,连Lombok的选项都加入到SpringBootInitalizr中。Lombok官网简介:ProjectLombok是一个自动插入你的编辑器和构建工具的java库,为你的java.js增添趣味。永远不要再写另一个getter或equals方法。抢先体验未来的Java功能,例如val等等。直白地说:Lombok是一个Java?实用程序,可帮助开发人员消除Java的冗长,尤其是对于简单Java对象(POJO)。它通过注解来达到这个目的,看:Bean与传统POJO类的比较是这样的。Lombok改造的POJO类是这样的。一眼就可以看出我们在写Employee类的时候已经通过@Data注解实现了。去掉了所有成员变量的get()和set()方法,Employee类看起来更清晰简洁。龙目岛的神奇之处不止于此。丰富的注解满足了我们绝大部分的开发需求。Lombok的安装看下图,@Data的实现,我们发现这个注解是在编译阶段应用的,和我们使用的大部分注解有很大区别,比如Spring的注解(通过反射实现业务逻辑atruntime)比较大的区别,比如Spring的@RestController注解更直接的体现,就是普通IDE可以自动识别引用普通包后的语法,但是Lombok的这些注解不能被普通IDE自动识别,所以如果你想要使用Lombok,还需要安装相应的插件来支持IDE的编译,防止IDE自动检查报错。下面以IntelliJIDEA为例安装插件。在Repositories中搜索Lombok,安装完成后重启IDE,为Maven或Gradle项目添加依赖。此时,我们就可以使用Lombok提供的注解来做一些事情了。龙目岛注解详解龙目岛官网提供了很多注解,但是“酒虽好,勿贪”。接下来对官网推荐的注解一一进行说明(一些和Java原版写法差别不大的注解就不在这里列出了,比如@Synchronized等)@Getter和@Setter这个注解可以应用于类或成员变量。正如我们所料,@Getter和@Setter会自动为成员变量生成get和set方法,默认生成access。许可是一种公共方法。当然我们也可以指定访问权限protected等,如下图所示:成员变量名指定生成set方法,访问权限受保护;boolean成员变量female只生成get方法,方法名改为isFemale()。当这个注解应用于类时,默认为所有非静态成员变量生成get和set方法,也可以通过AccessLevel.NONE手动禁用get或set方法,如下图:@ToString这个注解需要应用在类上,为我们生成Object的toString方法,注解中的几个属性可以丰富我们想要的内容。exclude属性禁止在toString方法中使用某个字段,of属性可以指定要使用的字段,如下图:View编译生成的Employee.class得到了我们预期的结果,如下图下图@EqualsAndHashCode这个注解需要应用到类上。使用这个注解,lombok会为我们生成equals(Objectother)和hashcode()方法,包括所有非静态属性和非静态Transient属性,同样,这个注解也可以通过exclude属性排除某些字段,指定某些字段通过of属性,或者通过callSuper属性在重写的方法中使用父类的字段,这样我们可以更灵活的定义bean进行比较,如下图:查看编译后的Employee.class文件,如图下图中:@NonNull这个注解需要在方法或构造函数的参数或属性上打上,判断参数的合法性,默认会抛出NullPointerExceptionViewNonNullExample.class文件会抛出空指针异常us,如下图所示:当然我们也可以通过指定异常类型抛出其他异常,lombok.nonNull.exceptionType=[NullPointerException|IllegalArgumentException],为了实现这个功能我们需要在项目的根目录下新建一个lombok.config文件:重新编译NonNullExample类,已经为我们抛出非法参数异常:@NoArgsConstructor,@RequiredArgsConstructor,@AllArgsConstructor上面三个注解为我们生成了一个无参构造函数,指定了一个有参构造函数和包含所有参数的构造函数。默认情况下,@RequiredArgsConstructor和@AllArgsConstructor生成的构造函数将对所有标记为@NonNull的属性进行非空检查。无参数构造函数很容易理解。我们主要看后两者。我们先来看@RequiredArgsConstructor。从上图中我们可以看出,@RequiredArgsConstructor注解在生成有参构造函数时,只会包含带有final和@NonNull标记的字段。同时我们可以通过生成静态方法指定staticName来构造对象。检查Employee.class文件。当我们去掉staticName属性后,再看看以后的文件:相信你已经注意到了细节。@AllArgsConstructor就更简单了,请自行查看@Data引入上面的注解,再引入@Data,非常容易理解。@Data注解应用于类,是@ToString、@EqualsAndHashCode、@Getter/@Setter和@RequiredArgsConstructor的体现,如下图所示:@Builder函数式编程或流式操作越来越流行.在大多数语言中都使用它们来使程序更简洁、更易读、更连贯。@Builder带这个功能生成一系列的builderAPI,这个注解也需要应用到类上,看下面的例子会更清楚。编译出来的Employee.class文件如下:妈妈再也不用担心我的setvalue这么麻烦了,流式操作就搞定了:@Log这个注解需要加在class上。在写服务层的时候,需要添加一些日志来定位问题。我们通常会定义一个静态常量Logger,然后将其应用到我们要记录日志的地方,现在一个注解就可以实现了:看类文件,果然如我们所料:有很多变种Log,CommonLog,Log4j,Log4j2,Slf4j等,lombok通过变体注解还是很好的支持:我其实用的是@Slf4j注解val。熟悉Javascript的同学都知道,var可以定义任意类型的变量,而在java的实现中,我们需要指定具体变量的类型,而val可以让我们摆脱指定。编译后类型会准确匹配。默认是final类型,就像java8的函数式表达,()->System.out.println("hellolombok");可以解析成Runnable函数接口。查看解析后的类文件:@Cleanup我们在对流进行操作的时候,通常需要调用close方法来关闭或者结束某个资源,@Cleanup注解可以帮助我们调用close方法,放在try/finally处理块,如下图:编译后的class文件如下。我们发现它被try/finally包围了,调用了stream的close方法。其实在JDK1.7之后就有了try-with-resource。我们不需要显式关闭流。这请让我们自己看看。Lombok的基本运行流程如下:在编译时定义注解使用JSR269api(PluggableAnnotationProcessingAPI)在编译时创建注解处理器使用tools.jar的javacapi处理AST(抽象语法树)函数注册到lombok的jar包中。当然,还有很多注解。我建议使用上面的就足够了。这个工具带来了方便,不能被它捆绑。专注于”,Lombok让我更专注于有效的代码,剔除意义不大的晦涩代码(get、set等)。另外,Lombok生成的代码可以像使用工具类(@Builder)一样方便。
