SpringBoot学习历程(六):集成Lombok

1. 简介

  Project Lombok makes java a spicier language by adding ‘handlers’ that know how to build and compile simple, boilerplate-free, not-quite-java code.
即Lombok通过增加一些“处理程序”,可以让java变得简洁、快速。
  Lombok能通过注解的方式,在编译时自动为属性生成构造器、getter/setter、equals、hashcode、toString方法。同时可以自动化日志变量。

2. 引入Lombok

  使用Lombok需要的开发环境Java+Maven+IntelliJ IDEA或者Eclipse(安装Lombok Plugin)。

2.1 添加maven依赖

<!-- 引入lombok依赖 -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <scope>provided</scope>
</dependency>

2.2 idea安装插件

  打开idea的设置,点击Plugins,点击Browse repositories,在弹出的窗口中搜索lombok,然后安装即可。


在这里插入图片描述

2.3 编译时出错问题

编译时出错,可能是没有enable注解处理器。在设置中找到Annotation Processors > Enable annotation processing。设置完成之后程序正常运行。

2.4 常用注解

  • @Setter :注解在类或字段,注解在类时为所有字段生成setter方法,注解在字段上时只为该字段生成setter方法。

  • @Getter :使用方法同上,区别在于生成的是getter方法。

  • @ToString :注解在类,生成toStirng方法。

  • @EqualsAndHashCode :注解在类,生成hashCode和equals方法。

  • @Data :注解在类,生成setter/getter、equals、canEqual、hashCode、toString方法,如为final属性,则不会为该属性生成setter方法。

  • @NoArgsConstructor :注解在类,生成无参的构造方法。

  • @AllArgsConstructor :注解在类,生成包含类中所有字段的全参的构造方法。

  • @RequiredArgsConstructor :注解在类,为类中需要特殊处理的字段生成构造方法,比如final和被@NonNull注解的字段。

  • @Log4j :注解在类上;为类提供一个 属性名为log 的 log4j 日志对象

  • @Slf4j :注解在类,生成log变量,严格意义来说是常量。private static final Logger log = LoggerFactory.getLogger(UserController.class);

==注意:== 在使用以上注解需要处理参数时,处理方法如下(以@ToString注解为例,其他注解同@ToString注解):

  • @ToString(exclude="column")
    意义:排除column列所对应的元素,即在生成toString方法时不包含column参数;

  • @ToString(exclude={"column1","column2"})
    意义:排除多个column列所对应的元素,其中间用英文状态下的逗号进行分割,即在生成toString方法时不包含多个column参数;

  • @ToString(of="column")
    意义:只生成包含column列所对应的元素的参数的toString方法,即在生成toString方法时只包含column参数;;

  • @ToString(of={"column1","column2"})
    意义:只生成包含多个column列所对应的元素的参数的toString方法,其中间用英文状态下的逗号进行分割,即在生成toString方法时只包含多个column参数;
    ==----------------------------------------------------------------------------------------------------==

  • @Cleanup : 可以关闭流
  • @Builder : 被注解的类加个构造者模式
  • @Synchronized : 加个同步锁
  • @SneakyThrows : 等同于try/catch 捕获异常
  • @NonNull : 如果给参数加个这个注解,参数为null会抛出空指针异常
  • @Value : 注解和@Data类似,区别在于它会把所有成员变量默认定义为private final修饰,并且不会生成set方法。
  • @Accessors:注解在类或者属性上;主要用于控制生成的getter和setter。
      fluent: boolean值,默认为false。此字段主要为控制生成的getter和setter方法前面是否带get/set
      chain :boolean值,默认false。如果设置为true,setter返回的是此对象,方便链式调用方法
      prefix: 设置前缀 例如:@Accessors(prefix = “abc”) private String abcAge; 当生成get/set方法时,会把此前缀去掉。

3. 工作原理

lombok的核心之处就是对于注解的解析上。
JDK5引入了注解的同时,也提供了两种解析方式:

  • 运行时解析:
     运行时能够解析的注解,必须将@Retention设置为RUNTIME,这样就可以通过反射拿到该注解。java.lang.reflect反射包中提供了一个接口AnnotatedElement,该接口定义了获取注解信息的几个方法,Class、Constructor、Field、Method、Package等都实现了该接口。
  • 编译时解析:
     编译时解析有两种机制,分别简单描述下:
    • Annotation Processing Tool
      apt自JDK5产生,JDK7已标记为过期,不推荐使用,JDK8中已彻底删除,自JDK6开始,可以使用Pluggable Annotation Processing API来替换它,apt被替换主要有2点原因:
      api都在com.sun.mirror非标准包下;没有集成到javac中,需要额外运行。
    • Pluggable Annotation Processing API
      JSR 269自JDK6加入,作为apt的替代方案,它解决了apt的两个问题,javac在执行的时候会调用实现了该API的程序,这样我们就可以对编译器做一些增强,javac执行的过程如下:


      在这里插入图片描述

      Lombok本质上就是一个实现了“JSR 269 API”的程序。在使用javac的过程中,它产生作用的具体流程如下:

      • javac对源代码进行分析,生成了一棵抽象语法树(AST);
      • 运行过程中调用实现了“JSR 269 API”的Lombok程序;
      • 此时Lombok就对第一步骤得到的AST进行处理,找到@Data注解所在类对应的语法树(AST),然后修改该语法树(AST),增加getter和setter方法定义的相应树节点;
      • javac使用修改后的抽象语法树(AST)生成字节码文件,即给class增加新的节点(代码块)。通过读Lombok源码,发现对应注解的实现都在HandleXXX中,比如@Getter注解的实现在HandleGetter.handle()。还有一些其它类库使用这种方式实现,比如Google Auto、Dagger等等。

4. Lombok的优缺点

优点:

  • 能通过注解的形式自动生成构造器、getter/setter、equals、hashcode、toString等方法,提高了一定的开发效率;
  • 让代码变得简洁,不用过多的去关注相应的方法;
  • 属性做修改时,也简化了维护为这些属性所生成的getter/setter方法等;

缺点:

  • 不支持多种参数构造器的重载;;
  • 虽然省去了手动创建getter/setter方法的麻烦,但大大降低了源代码的可读性和完整性,降低了阅读源代码的舒适度;
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,928评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,192评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,468评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,186评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,295评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,374评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,403评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,186评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,610评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,906评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,075评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,755评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,393评论 3 320
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,079评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,313评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,934评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,963评论 2 351

推荐阅读更多精彩内容