Lombok是什么?

它是一个能帮我们消除那些必须要写但是重复的代码,比如setter,getter,构造函数之类的方法。

idea安装lombok:

ideasettings(windows)或者Preferences(mac),下找到plugins菜单,点击Browse repositories,如图

然后搜索lombok,点击右侧下载,下载完成重启即可,如图

新建项目,在pom文件中加入lombok依赖,完整pom如下:

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.16.20</version>
</dependency>

新建一个User类,这个是使用lombok的类,代码如下:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private Integer id;
    private String name;
    private String password;
}

编译的Class文件
在这里插入图片描述

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.SOURCE)
public @interface Data {
    String staticConstructor() default "";
}

@Data 注解@Retention(RetentionPolicy.SOURCE)只会在源文件中有效(即源文件保留)

lombok常用注解

1、@Data 注解 : 一般用在类上,提供类所有属性的 get 和 set 方法,此外还提供了equals、canEqual、hashCode、toString等方法;
2 、@Setter 注解:一般用在属性上,为属性提供 set 方法, 用在再类上则表示当前类中所有属性都生成set方法;
3、@Getter 注解:用在属性上,为属性提供 get 方法, 用在再类上表示当前类中所有属性都生成get方法;
4、@Log4j or @Slf4j 注解 :用在类上,为类提供一个 属性名为log 的 log4j日志对象;
5、@NoArgsConstructor注解:用在类上,为类提供一个无参的构造方法;
6、@AllArgsConstructor注解:用在类上,为类提供一个全参的构造方法;
7、@RequiredArgsConstructor注解: 用在类上,生成一个包含 “特定参数” 的构造器,特定参数指的是那些有加上 final 修饰词的变量们;
8、@Builder注解: 用在类上,自动生成流式 set 值写法,从此之后再也不用写一堆 setter 了;

@RequiredArgsConstructor和final代替@Autowired

在Spring4.x中增加了新的特性:

如果类中只提供了一个带参数的构造方法,则不需要对对其内部的属性写@Autowired注解,Spring会自动为你注入属性;

Spring依赖注入的方式

  • @Autowired属性注入
  • 构造器注入
  • setter注入

1、@Autowired属性注入

@Aspect
@Component
@Slf4j
public class LogAspect {
	@Autowired
    HttpServletRequest request;
    @Autowired
    OperateLogMapper operateLogMapper;
}

2、构造器注入

Spring4.3+之后,constructor注入支持非显示注入方式。不需要在带参数的构造方法写@Autowired注解

@Aspect
@Component
public class LogAspect {
    private final Logger Logger = LoggerFactory.getLogger(LogAspect.class);
    // @Autowired
    HttpServletRequest request;
    // @Autowired
    private OperateLogMapper operateLogMapper;
    
    public LogAspect(HttpServletRequest request, OperateLogMapper operateLogMapper) {
        this.request = request;
        this.operateLogMapper = operateLogMapper;
    }
}

在这里插入图片描述

idea已经识别注入图标了

3、setter注入

@Aspect
@Component
public class LogAspect {
    private final Logger Logger = LoggerFactory.getLogger(LogAspect.class);

    HttpServletRequest request;
    private OperateLogMapper operateLogMapper;

    @Autowired
    public void setRequest(HttpServletRequest request) {
        this.request = request;
    }
    @Autowired
    public void setOperateLogMapper(OperateLogMapper operateLogMapper) {
        this.operateLogMapper = operateLogMapper;
    }
}

@RequiredArgsConstructor: 用在类上,生成一个包含 “特定参数” 的构造器,特定参数指的是那些有加上 final 修饰词的变量们;

使用: 当我们需要注入Bean的时候可以直接在类名称上使用@RequiredArgsConstructor,需要注入的属性对象必须声明为final修饰。就可以代替Autowrited注解

@Aspect
@Component
@Slf4j
@RequiredArgsConstructor
public class LogAspect {
    final HttpServletRequest request;
    final OperateLogMapper operateLogMapper;
}

在这里插入图片描述

Lombok @Data注解开发遇到的问题

不标准驼峰导致参数获取不到

Ctroller层接收Person对象参数,无法注入uName、pId的值。即属性值为空,定位原因是使用@Data生成get/set方法不正确

1、实体类

public class Person {
    private String uName;
    private Integer pId;
}

2、正常的idea生成get/set方法。如下:

public class Person {
    private String uName;
    private Integer pId;

    public String getuName() {
        return uName;
    }
    public void setuName(String uName) {
        this.uName = uName;
    }
    public Integer getpId() {
        return pId;
    }
    public void setpId(Integer pId) {
        this.pId = pId;
    }
}

在这里插入图片描述

3、使用Lombok @Data注解生成get/set方法

@Data
public class Person {
    private String uName;
    private Integer pId;
}

4、查看编译后的class文件,@Data注解生成get/set方法

在这里插入图片描述

is属性出现的问题

布尔类型的isDelete属性,使用@Data生成get/set方法都会出现问题

@Data
public class User {
    private String id;
    private String isEnable;
    private boolean isDelete;
}

@Data生成的get/set方法

在这里插入图片描述

1、boolean类型的isXXX属性,使用@Data生成get方法错误,方法没有以get开头

2、boolean类型的isXXX属性,使用@Data生成set方法错误,方法去掉了属性的is

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐