lombok是怎么用的

lombok

Lombok是一个Java库,能自动插入编辑器并构建工具,简化Java开发。通过添加注解的方式,不需要为类编写getter或equals方法,同时可以自动化日志变量。用大白话来讲,Lombok可以通过几个注释在编译的时候为我们的JavaBean动态的生成get,set,tostring,无参构造方法,全参数构造方法,基于builder的创建方式。image-20241128091018603

在[上一节](用一个项目把控制层、业务层、持久层说明白了,每一句话都讲的很清楚 - ivanlee717 - 博客园)在我们定义一个实体类的时候,会用快捷方法生成了很多方法,但是这种代码我们可以直接通过几个简单的注解完成。

lombok安装

<!--Lombok引入-->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>

image-20241128093002481

lombok原理

Lombok的基本实现原理可以概括为以下几个步骤:

  1. 注解扫描:Lombok的注解处理器会扫描Java源代码中的注解,并找到使用了Lombok注解的类、字段和方法。
  2. AST操作:Lombok注解处理器会对注解所标注的类进行抽象语法树(AST)的解析和操作,以识别和处理这些注解。
  3. 注解解析:注解处理器解析找到的注解,确定需要生成的代码类型和内容。
  4. 代码生成:基于注解的定义和规则,Lombok注解处理器生成相应的代码片段,如getter和setter方法、构造函数等。
  5. 代码注入:生成的代码片段被插入到编译结果中的相应位置,与手动编写的代码合并在一起。
  6. 最终编译:编译器将生成的代码和手动编写的代码一起编译为最终的字节码文件。

image-20241128093547668

普通的java程序运行原理如上图所示,但是lombok会作为一个插件帮助用户代码更简洁image-20241128100123009

lombok注解

注解 注解作用
@Getter 自动生成getter方法
@Setter 自动生成Setter方法
@ToString 自动生成tostring方法
@EqualsAndHashCode 自动生成equals和hashCode方法
@NoArgsConstructor 自动生成无参构造函数
@AllArgsConstructor 自动生成包含所有字段的构造函数

常用的组合注解有

注解 注解作用
@Data 组合了@Getter、@Setter、@ToString、@EqualsAndHashCode等注解的功能
@Value 组合了@Getter、@ToString、@EqualsAndHashCode等注解的功能

@Data注解和@Value注解有哪些区别?

@Data生成的类是可变的,具有可读写的setter方法,@Value生成的类是不可变的,字段是final的,没有生成setter方法。

Lombok日志注解:

注解 注解作用
@Slf4j 自动生成一个名为log的日志记录器

其他注解用的不多,先提一下

注解 注解作用
@Builder 自动生成Builder模式的构造器方法
@NonNull 自动生成非空检查
@Delegate 自动生成委托方法
@Cleanup 自动释放资源

代码实现

image-20241128114053957

直接设置这三个注解就帮助我们搞定了很多冗余的代码,现在写一个测试方法

@Test
public void lombok(){
    User user = new User();
    user.setUsername("test");
    user.setPassword("1234");
    user.setGender(1);
    user.setCreateUser(user.getUsername());
    user.setModifiedUser(user.getUsername());
    Date date = new Date();
    user.setCreateTime(date);
    user.setModifiedTime(date);
    System.out.println(user.toString());
}

image-20241128114629401

上述过程也可以直接使用@Data解决。

如果在定义实体的时候使用@builder,可以在声明一个实例的时候运用以下写法

User user = User.builder()
                .uid(1)
                .username("1234")
                .password("5678")
                .gender(0)
                .email("kxcnsakdn").build();
System.out.println(user.toString());

image-20241128171154147

posted @ 2024-11-28 17:14  ivanlee717  阅读(69)  评论(0编辑  收藏  举报