Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Lombok 介绍

Lombok 介绍

作者头像
四火
发布于 2022-07-15 13:44:41
发布于 2022-07-15 13:44:41
52400
代码可运行
举报
文章被收录于专栏:四火的唠叨四火的唠叨
运行总次数:0
代码可运行

最初我是在公司内部的 broadcast 上面听到有 principal 介绍到它的,和 AspectJ 归在一起。看了几个例子之后觉得有点意思,就去 Lombok 的官网上扒了一下。我们已经知道向 AspectJ、CGLib 等等都可以做到对已有 Java 代码在字节码层级的改变,无论是编译时期静态织入还是运行时期动态代理,对于我们使用 AOP 来减少那些重复性编码的劳动、增加切面性质的逻辑颇有帮助。这里有几个概念:

  • 首先是 AOP,我在这里不啰嗦,网上有的是这样的文章。
  • 其次,如果你还没有接触过 AspectJ,那么在 Lombok 之前,AspectJ 是值得推荐了解的。和 Lombok 相比,AspectJ 更强大,有它自己的语法,本身更像是一个代码生成器,它有独特的语法编译工具,可以自己生成 class 文件。换言之,它已经超出了往常 Java 项目最后简单地编译成 “jar” 被调用的范畴。
  • 再次,是 JDK 的动态代理。原理上不复杂,JDK 的 Proxy 类提供了一个建立代理对象的方法,需要传入被代理对象的接口集合、class loader 和代理对象自己,其中代理对象需要实现 InvocationHandler 的 invoke 方法,在其中实现了,对于被代理对象的方法执行,可以进行任意的行为改变。最终,生成的代理对象和被代理对象实现自相同的接口,只是方法的行为被改变了。
  • 最后,是 CGLib。相较于 AspectJ,CGLib 是一个纯纯粹粹的 jar 包而已了,也就意味着,它对于字节码的织入,只能在运行时通过某种方式实现了。它使用的方式是动态代理,但是相对于 JDK 传统的动态代理方式,它没有对被代理对象接口的要求,换言之,如果被代理对象没有实现自任何接口,或者期望改变的方法没有源自任何接口,只要不是 final 修饰的类和方法,一样可以做到动态代理。它的原理也不复杂,在运行时给被代理类创建一个子类,覆写被代理类中需要改变行为的方法。和 JDK 的动态代理相比,除去类创建时更大的开销,在方法执行时它的效率要高过前者。

现在让我们回到 Lombok,它的原理和 AspectJ 类似。它的目的在于让程序员少写一些 “样板代码”。所谓样板代码,是那些没有营养,却又不得不写的代码,写的时候觉得毫无技术含量,依样画葫芦,比如一个类的全参构造函数、无参构造函数、get/set 方法、toString 方法等等。这些代码你可以指望向 Eclipse 这样的 IDE 帮你自动生成到你的代码文件里去,当然,也可以借由 Lombok 这样的工具,在编译阶段,不修改你的代码源文件,但是让编译出的 class 文件具备样板代码的逻辑。

下面这张图来自 Lombok 官网的一段视频。你可以看到左侧的代码仅仅是一个普通的 POJO 类,增加了 Lombok 的注解而已。右侧显示了编译出的 class 文件,get/set 方法已经生成完毕。可以使用反编译工具打开 class 文件查看,这样的 class 文件和手写样板代码生成出来的 class 文件是一样的。

我们再来仔细认识一下 Lombok 的特性:

  1. val 关键字:

你可以使用 val 关键字写出这样的代码来,看起来就是 duck type 啊:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public String example() {
  val example = new ArrayList();
  example.add("Hello, World!");
  val foo = example.get(0);
  return foo.toLowerCase();
}
  1. 注解,除了一看便知的 @Getter、@Setter、@ToString 等等以外,我介绍几条有意思的 Lombok 注解,你可以在这里找到全集
  • @Data:相当于同时使用了 @ToString、@EqualsAndHashCode、@Getter、@Setter 和 @RequiredArgsConstructor 这些注解,对于 POJO 类十分有用。
  • @NonNull:给方法参数增加这个注解会自动在方法内对该参数进行是否为空的校验,如果为空,则抛出 NPE。
  • @Cleanup:自动生成 try-finally 这样的代码来关闭流(你一定写过使用-关闭流的样板代码)。
  • @Getter(lazy=true):可以替代掉经典的 Double Check Lock 样板代码!

我很喜欢这种小项目,很小的范围,简单,而且专注,解决非常特定的问题。

文章未经特殊标明皆为本人原创,未经许可不得用于任何商业用途,转载请保持完整性并注明来源链接 《四火的唠叨》

×Scan to share with WeChat

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java深入理解AOP(什么是AOP,AOP底层实现原理、应用)
1、AOP:Aspect Oriented Programming(面向切面编程),OOP是面向对象编程,AOP是在OOP基础之上的一种更高级的设计思想。
鱼找水需要时间
2023/02/16
4470
jvm源码解析(八)动态代理是如何实现的,JDK Proxy于CGLib有什么区别
程序在运行期间可以访问、检测和修改其本身状态或行为的一种能力,使用反射我们可以调用任意一个类对象,以及类对象中包含的属性及方法
JathonKatu
2020/10/27
7320
jvm源码解析(八)动态代理是如何实现的,JDK Proxy于CGLib有什么区别
博主说一个案例就可以讲明什么是面向切面编程,粉丝笑了!
💘 一、前言 大家好,我是小诚,又到了愉快的学习时间,上一周因为小伙伴投稿,所以写了:《什么是面向接口编程》,文章颇受大家欢迎,于是又有小伙伴建议介绍关于:面向切面编程的知识点,于是就有了本篇文章,没办法,就是这么宠粉!(有亿点自恋...) 再唠叨两句,因为工作和个人要求原因,之前写得MySQL从0学习序系列好久没有更新了,但是,请大家相信,这个系列不会断更,小诚会要以更高的要求和质量继续编写,相信能够给大家带来更多更好的文章。 💕 三、初次见面-面向切面编程   前一篇文章我们介绍了什么是面
IT学习日记
2022/09/13
3670
博主说一个案例就可以讲明什么是面向切面编程,粉丝笑了!
Spring AOP 实现原理与 CGLIB 应用
AOP(Aspect Orient Programming),作为面向对象编程的一种补充,广泛应用于处理一些具有横切性质的系统级服务,如事务管理、安全检查、缓存、对象池管理等。AOP 实现的关键就在于 AOP 框架自动创建的 AOP 代理,AOP 代理则可分为静态代理和动态代理两大类,其中静态代理是指使用 AOP 框架提供的命令进行编译,从而在编译阶段就可生成 AOP 代理类,因此也称为编译时增强;而动态代理则在运行时借助于 JDK 动态代理、CGLIB 等在内存中“临时”生成 AOP 动态代理类,因此也被
java达人
2018/01/31
9040
Spring AOP 实现原理与 CGLIB 应用
Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day16】—— Spring框架2
  本栏目Java开发岗高频面试题主要出自以下各技术栈:Java基础知识、集合容器、并发编程、JVM、Spring全家桶、MyBatis等ORMapping框架、MySQL数据库、Redis缓存、RabbitMQ消息队列、Linux操作技巧等。
陈哈哈
2021/12/31
6500
Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day16】—— Spring框架2
面试官提问:什么是动态代理?
代理这个词最早出现在代理商这个行业,所谓代理商,简而言之,其实就是帮助企业或者老板打理生意,自己本身不做生产任何商品。
Java极客技术
2022/12/02
2100
面试官提问:什么是动态代理?
Spring 夺命连环18问
控制反转就是说,「把对象的控制权交给了 spring,由 spring 容器进行管理」,我们不进行任何操作
苏三说技术
2022/08/25
4600
Spring 夺命连环18问
Spring AOP 的实现原理
AOP(Aspect Orient Programming),我们一般称为面向方面(切面)编程,作为面向对象的一种补充,用于处理系统中分布于各个模块的横切关注点,比如事务管理、日志、缓存等等。AOP实现的关键在于AOP框架自动创建的AOP代理,AOP代理主要分为静态代理和动态代理,静态代理的代表为AspectJ;而动态代理则以Spring AOP为代表。本文会分别对AspectJ和Spring AOP的实现进行分析和介绍。 使用AspectJ的编译时增强实现AOP 之前提到,AspectJ是静态代理的增强,
用户1257393
2018/03/21
1.2K0
从代理机制到Spring AOP,这篇给你安排的明明白白的
代理模式是很常见的一种设计模式,代理一词拆开来看就是代为受理,那显然是要涉及到请求被代理的委托方,提供代理的代理方,以及想要通过代理来实际联系委托方的客户三个角色。
芋道源码
2021/11/11
5140
从代理机制到Spring AOP,这篇给你安排的明明白白的
AOP知识梳理
Dubbo 了解过吧,对外提供的服务可能有多个方法,一般我们为了不给调用方埋坑,会在每个方法里把所有异常都 catch 住,只返回一个 result,调用方会根据这个 result 里的 success 判断此次调用是否成功,举个例子
Vincent-yuan
2021/12/16
3350
AOP知识梳理
2023新版Spring6全新讲解-核心内容之AOP
  在学习Spring的AOP之前我们需要补充下设计模式中的代理模式。这块是理解AOP的必备基础内容。
用户4919348
2023/05/28
3320
2023新版Spring6全新讲解-核心内容之AOP
【小家Spring】Spring AOP的多种使用方式以及神一样的AspectJ-AOP使用介绍
AOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善。
YourBatman
2019/09/03
2.7K0
【小家Spring】Spring AOP的多种使用方式以及神一样的AspectJ-AOP使用介绍
系统学习SpringFramework:Spring AOP
AOP(Aspect oriented programming),即面向切面编程,它是一个编程范式,是 OOP(面向对象编程)的一种延续,目的就是提高代码的模块性。
栗筝i
2022/12/01
2970
Spring AOP使用
AOP全程是Aspect—Oriented—Programming,面向切面编程。AOP采用横向抽取机制,将分散在各个方法中的重复代码抽取出来,然后在程序编译或运行时,再将这些提取出来的代码应用到需要执行的地方。
ha_lydms
2023/08/09
2040
Spring AOP使用
JDK动态代理、Cglib动态代理及Spring AOP
Java中的JDK动态代理是一种通过反射机制生成代理对象的技术,使得我们能够在运行时动态地创建某个接口的代理类,而无需手动编写实现类。JDK动态代理通常用于横切关注点(如日志、事务管理、安全性等)在方法调用前后进行处理,而不需要修改目标类的源代码。
意疏
2024/12/31
2740
JDK动态代理、Cglib动态代理及Spring AOP
Spring AOP的实现原理
AOP(Aspect Orient Programming),我们一般称为面向方面(切面)编程,作为面向对象的一种补充,用于处理系统中分布于各个模块的横切关注点,比如事务管理、日志、缓存等等。AOP实现的关键在于AOP框架自动创建的AOP代理,AOP代理主要分为静态代理和动态代理,静态代理的代表为AspectJ;而动态代理则以Spring AOP为代表。本文会分别对AspectJ和Spring AOP的实现进行分析和介绍。
Java团长
2018/08/06
4820
Java 中反射、注解、动态代理、AOP 之间的联系
AOP 即 Aspect Orient Programming 是以一种编程范式,在不同业务中横着切一刀形成一个切面,在此切面上做一些相同的事情。Aspect 就是切面。
菜皮日记
2023/12/18
4460
Spring AOP、AspectJ、CGLIB 怎么说清楚?
AOP(Aspect Orient Programming),作为面向对象编程的一种补充,广泛应用于处理一些具有横切性质的系统级服务,如事务管理、安全检查、缓存、对象池管理等。AOP 实现的关键就在于 AOP 框架自动创建的 AOP 代理,AOP 代理则可分为静态代理和动态代理两大类,其中静态代理是指使用 AOP 框架提供的命令进行编译,从而在编译阶段就可生成 AOP 代理类,因此也称为编译时增强;而动态代理则在运行时借助于 JDK 动态代理、CGLIB 等在内存中“临时”生成 AOP 动态代理类,因此也被称为运行时增强。
用户1516716
2021/11/23
1.5K0
Spring编程模型(范式)
契约接口(Aware)是Spring框架中的一个特性,它允许Bean对象意识到它们所在的环境并与之进行交互,用于提供特定的功能或信息给Bean对象。这些接口通常作为回调接口,在Bean初始化过程中被Spring容器调用,以便向Bean提供额外的环境信息或资源。通过实现相对应的Aware接口,Bean可以获取对应的Spring容器实例或其他相关资源。
关忆北.
2023/10/11
2660
Spring AOP(一) AOP基本概念
 Spring框架自诞生之日就拯救我等程序员于水火之中,它有两大法宝,一个是IoC控制反转,另一个便是AOP面向切面编程。今日我们就来破一下它的AOP法宝,以便以后也能自由使出一手AOP大法。
程序员历小冰
2019/02/11
4950
Spring AOP(一) AOP基本概念
相关推荐
Java深入理解AOP(什么是AOP,AOP底层实现原理、应用)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验