5.1 Lombok 介绍
● Lombok 作用
-
简化 JavaBean 开发,可以使用 Lombok 的注解让代码更加简洁
-
Java 项目中,很多没有技术含量又必须存在的代码:
① POJO 的 getter/setter/toString
② 异常处理
③ I/O 流的关闭操作等等 -
这些代码既没有技术含量,又影响着代码的美观
-
Lombok 应运而生
● SpringBoot 和 IDEA 官方支持
- IDEA 2020 已经内置了 Lombok 插件
- SpringBoot 2.1.x 之后的版本也在 Starter 中内置了 Lombok 依赖
5.2 Lombok 常用注解
@Data
注解在类上,提供类所有属性的 getter 和 setter 方法,此外还提供了 equals、canEqual、hashCode、toString 方法@Setter
注解在属性上,为属性提供 setter 方法@Getter
注解在属性上,为属性提供 getter 方法@Log4j
注解在类上,为类提供一个 属性名为log 的 log4j 日志对象@NoArgsConstructor
注解在类上,为类提供一个无参构造器@AllArgsConstructor
注解在类上,为类提供一个全构造器@Cleanup
可以关闭流@Builder
被注解的类加个构造者模式@Synchronized
加个同步锁@SneakyThrows
等同于 try/catch 捕获异常@NonNull
如果参数加这个注解,参数为 null 会抛出空指针异常@Value
注解和 @Data 类似,区别在于它会把所有的成员变量默认定义为 private final 修饰,并且不会生成 setter 方法
5.3 Lombok 应用实例
5.3.1 需求说明
- 使用 Lombok 简化 Furn.java 代码 , 让代码简洁高效
5.3.2 代码实现
- 在 pom.xml 引入 lombok
<!-- 引 入 lombok, 版本在 spring-boot-dependencies-2.5.3.pom 指定了,把光标放在 lombok ctrl+b 可以看到-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
---------------------看对应的版本-----------------
- 修改 Furn.java 使用 Lombok 注解简化代码,提示:可以通过 idea 自带的反编译功能,看 Furn.class 的源码,就可以看到生成的完整代码
package com.xjs.springboot.bean;
import lombok.*;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* @Author: 谢家升
* @Version: 1.0
*/
@Component
@ConfigurationProperties(prefix = "furn01")
//@ToString //在编译时,生成 toString方法, 默认情况下 会生成一个无参构造器
/**
* 解读:@Data
* 1. Equivalent to {@code @Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode}.
* 2. @Data 等价使用了 如下注解: @Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode
* 3. @RequiredArgsConstructor : 单独的说一下
*/
//@Data
/**解读:@NoArgsConstructor
* 1. 在编译时,会生成无参构造器,前面也说了,默认情况下 也会生成一个无参构造器
* 2. 当我们有其他构造器生成时,如果你希望仍然有无参构造器,就需要使用 @NoArgsConstructor注解 来指定一下
* 否则就会覆盖无参构造器,从而导致代码错误
*/
@NoArgsConstructor
/**
* 解读:@AllArgsConstructor
* 1. 在编译时,会生成全参构造器,注意 这里会覆盖 默认的 无参构造器
* 2. 如果我们需要无参构造器 可以有以下两种方式:
* (1) 手动生成一个 无参构造器
* (2) 标识 @NoArgsConstructor注解 也会生成一个无参构造器
*/
@AllArgsConstructor
public class Furn {
private Integer id;
private String name;
private Double price;
}
@RequiredArgsConstructor
说明:
- 在我们写controller或者Service层的时候,需要注入很多的mapper接口或者另外的service接口
- 这时候就会写很多的 @Autowired 注解,代码看起来很乱
- Lombok 提供了一个注解
@RequiredArgsConstructor(onConstructor =@_(@Autowired))
- 写在类上可以代替@Autowired注解
- 需要注意的是在注入时需要用final定义,或者使用@notnull注解
------------反编译, 看源码-----------
- 启动 MainApp.java ,完成测试
- 在 idea 安装 lombok 插件
- 不装插件也可以用基本的注解,比如
@Data
@Getter
等 - 但是不能使用其扩展功能,比如日志输出…
- 所以我们还是安装一下,也比较简单
- 演示使用 Lombok 支持日志输出 (建议使用 slf4j ),修改 D:\xjs_springboot\quickstart\src\main\java\com\xjs\HiController.java
package com.xjs;
import com.xjs.springboot.bean.Furn;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.annotation.Resource;
/**
* @Author: 谢家升
* @Version: 1.0
*/
@Slf4j
@Controller
public class HiController {
//需求: website属性值 application.properties 的 k-v 来获取
@Value("${my.website}")
private String website;
//装配到 HiController
@Resource
private Furn furn;
@RequestMapping("/hi")
@ResponseBody
public String hi() {
System.out.println("website= " + website);
return "hi~, SpringBoot";
}
@RequestMapping("/furn")
@ResponseBody
public Furn furn() {
//System.out.println("furn= " + furn);
//使用Slf4j日志输出
//普通方式
log.info("furn-" + furn);
//占位符方式输出
log.info("furn={} myFurn={}", furn, furn);
return furn;
}
}