LOMBOK

关于Lombok

Lombok是一个可以在编译期生成Setters & Getters、hashCode() & equals()toString()等代码的框架。

注意:Lombok生成这些代码是在编译期生成的,也就是源代码(.java文件)编译成目标文件(.class文件)的过程中生成的。

添加依赖

1
2
3
4
5
6
7
<!-- Lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
<version>1.18.20</version>
</dependency>

简单的使用

在任何类上添加@Data注解,就可以使得在编译期,会生成当前类的属性的Setters & Getters、hashCode() & equals()
toString()

其实,还有一些其它注解,例如:@Setter@Getter@EqualsAndHashCode@ToString@NoArgsConstructor @AllArgsConstructor等注解。

其中,@Data注解等效于@Setter@Getter@EqualsAndHashCode@ToString@NoArgsConstructor的组合使用。

关于Lombok插件

由于Lombok生成的代码仅在编译期才会出现,所以,各种开发工具都不识别此注解可生成的代码部分,所以,如果没有安装Lombok插件,
在调用各类型的Setter、Getter等方法时,开发工具会因为源代码中没有这些方法而报错,所以,为了避免开发工具提示错误、无法在编写代码时
提示Setter、Getter方法,应该安装插件。

使用争议

由于Lombok对插件有要求,所以,某些开发团队并不提倡,甚至禁止使用。

关于日志

为什么要使用日志

如果始终使用System.out.println()类似的输出语句来输出某些信息,在开发过程中,可能是无所谓的,但是,当项目开发完成后,这些信息不应该再被显示,
如果使用删除源代码、注释源代码的做法,则工作量较大,也不利于后续可能需要进行的功能更新或维护。

使用日志,可以根据级别进行输出,并根据不同的运行环境(开发环境、交付后的生产环境)来设置不同的显示级别,以保证某些信息只在开发过程中是被输出且可见的,
而这些信息在交付后的生产环境中将不可见。

日志的基本使用

在Spring Boot项目中,当添加了Lombok依赖后,可以在任意类上添加@Slf4j注解,则可以在类中使用名为log
的变量调用方法来输出日志(此变量是在编译期由Lombok添加的)。

调用输出日志的方法时,建议使用的方法是:

1
public void info(String format, Object... arguments);

即:第1个参数是字符串,表示需要输出的内容,但此字符串的各变量值均使用{}作为占位符,然后,第2个参数是可变参数,是Object
类型的,则第1个参数的字符串值中的各占位符对应的值均使用第2个参数依次表示。

日志的级别

在SLF4j中,日志的可显示级别,从信息的重要程度,从低到高依次为:

  • trace:跟踪信息
  • debug:调试
  • info:一般信息
  • warn:警告
  • error:错误

以上5个级别在使用log变量输出日志时都有对应的方法,方法名称就是这5个级别的名称,且这5个级别的方法的重载都是相同的!

根据调用的方法不同,输出的日志的级别就不同,例如,当调用info()系列方法(重载的多个方法)时,输info级别的出的日志就是,
当调用debug()系列方法时,输出的日志就是debug()级别的。

在Spring Boot项目中,在application.properties中,使用以下语法可以设置日志的显示级别:

1
logging.level.包名.类名=日志的显示级别

以上配置就可以将指定的类中的日志设置为指定的显示级别。

也可以配置为:

1
logging.level.包名=日志的显示级别

以上配置就可以将指定的包及其子孙包中所有类的日志设置为指定的显示级别。

一旦设置显示级别后,将显示设置级别及更重要的级别的日志,例如,设置为debug时,将显示debuginfowarnerror
都将显示,如果设置为warn时,将只显示warnerror级别的日志。

日志的优点

日志的优点主要有:

  • 可以配置来控制日志的显示级别
  • 日志的文本会被缓存,多次执行时,输出效率更高
  • 在进阶使用中,还可以将日志输出到指定的其它位置,例如文件、数据库等

关于SLF4j与其它日志框架

log4jlogback等日志框架都是比较主流的日志框架,而SLF4j是一套标准,它并没有具体的实现日志的功能,
所以,SLF4jlog4j / logback等更像是一个接口与实现类的关系(本质并不是)。

Knife4j

基本介绍

Knife4j是一款基于Swagger 2的在线API文档框架。

基本使用

在项目中添加依赖

1
2
3
4
5
6
<!-- Knife4j Spring Boot:在线API -->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
<version>2.0.9</version>
</dependency>

注意:以上依赖项仅适用于Spring Boot 2.6(不含)之前的版本。

在配置文件中开启增强模式

application.properties中添加:

1
knife4j.enable=true

自定义配置类,实现必要的配置

cn.tedu.csmall.server.config包下创建Knife4jConfiguration,并添加配置:

提示:以下配置代码是相对固定的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75

@Configuration
@EnableSwagger2WebMvc
public class Knife4jConfiguration {

/**
* 【重要】指定Controller包路径
*/
private String basePackage = "cn.tedu.csmall.server.controller";
/**
* 分组名称
*/
private String groupName = "product";
/**
* 主机名
*/
private String host = "http://java.tedu.cn";
/**
* 标题
*/
private String title = "酷鲨商城在线API文档--商品管理";
/**
* 简介
*/
private String description = "酷鲨商城在线API文档--商品管理";
/**
* 服务条款URL
*/
private String termsOfServiceUrl = "http://www.apache.org/licenses/LICENSE-2.0";
/**
* 联系人
*/
private String contactName = "Java教学研发部";
/**
* 联系网址
*/
private String contactUrl = "http://java.tedu.cn";
/**
* 联系邮箱
*/
private String contactEmail = "java@tedu.cn";
/**
* 版本号
*/
private String version = "1.0.0";

@Autowired
private OpenApiExtensionResolver openApiExtensionResolver;

@Bean
public Docket docket() {
String groupName = "1.0.0";
Docket docket = new Docket(DocumentationType.SWAGGER_2)
.host(host)
.apiInfo(apiInfo())
.groupName(groupName)
.select()
.apis(RequestHandlerSelectors.basePackage(basePackage))
.paths(PathSelectors.any())
.build()
.extensions(openApiExtensionResolver.buildExtensions(groupName));
return docket;
}

private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title(title)
.description(description)
.termsOfServiceUrl(termsOfServiceUrl)
.contact(new Contact(contactName, contactUrl, contactEmail))
.version(version)
.build();
}

}

使用

打开浏览器,输入 http://localhost:8080/doc.html 即可访问。

详细配置

  • 在控制器类上添加@Api注解,配置tags属性,可以指定模块名称(API文档中的一级菜单中显示的名称)
  • 在处理请求的方法上添加@ApiOperation注解,配置value属性,可以指定业务名称(API文档中的一级菜单的子项显示的名称)
  • 在处理请求的方法上添加@ApiOperationSupport注解,配置order属性,取值为数值,可以指定业务的显示排序序号,将根据order
    属性值升序排列
  • 在处理请求的方法的POJO参数的属性上添加@ApiModelProperty注解,配置value属性,可以指定参数的说明,
    另外,还可以通过此注解的required属性配置此参数是否必须(并不具备检查功能,只是在API文档上显示为必须提交)