一、lombok使用方法
在pom文件中添加,具体version版本,可以参考maven版本库的中lombok信息。可以查看目前已有的版本,可以选择使用较多的新版本即可。注意:一定要指定版本,如果不指定会使用最新版本,有可能由于版本不稳定造成各种奇奇怪怪的问题。
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
</dependency>
1、@Slf4j与@Log4j
二者都注解类,可用于打印日志,但是更推荐使用@Slf4j。原因如下:
(1)@Log4j是具体的日志实现。而@Slf4j是一个抽象层,它允许程序使用任意一个日志类库,使程序更加独立。
(2)@Slf4j可以使用占位符"{}",可减少代码中字符串连接次数
2、@AllArgsConstructor、@NoArgsConstructor、@RequiredArgsConstructor
这三个都在用于注解类,表示自动生成此类的构造器。
@AllArgsConstructor(包含所有参数的构造器)、
@NoArgsConstructor(无参构造器)、
@RequiredArgsConstructor(构造器只包含被final修饰的变量)
正常情况下,是不需要@NoArgsConstructor的,因为如果不手动建立一个构造函数,系统会为一个类建立一个无参构造器。
但是,如果手动建立一个非无参的构造函数,就需要@NoArgsConstructor了。同理,如果我们使用@AllArgsConstructor,最好再加上@NoArgsConstructor。
@NoArgsConstructor和@RequiredArgsConstructor的使用会产生冲突。按情况分析:
如果类中无final修饰的变量,@RequiredArgsConstructor会构建无参的构造函数
如果类中有final修饰的变量,且直接赋初始值,@RequiredArgsConstructor会构建无参的构造函数
如果类中有final修饰的变量,但没有直接赋初始值,构造函数中至少要包括全部的final修饰的变量,不可构建无参的构造函数。
import lombok.NoArgsConstructor;
@NoArgsConstructor
public class User{
private final String name="";
private String id;
}
// 反编译的结果:
package com.springboot.Entity;
public class User {
private final String name = "";
private Integer id;
public User() {
}
}
3、@Data:用于注解类,相当于同时加了如下五个注解
@Getter 所有变量的get方法
@Setter 所有变量的set方法
@ToString 输出这个变量的示例时,直接调用toString方法,输出所有变量的值
@EqualsAndHashCode 判等时使用,相当于同时加了equal和hashCode两个方法
@RequiredArgsConstructor 前面介绍过
如果@Data与@RequiredArgsConstructor加在类上,也不会产生冲突,只是会有代码的冗余。举个例子
import lombok.Data;
@Data
public class User{
private final String name="";
private Integer id;
}
// 反编译的结果
public class User {
private final String name = "";
private Integer id;
public User() {
}
public String getName() {
this.getClass();
return "";
}
public Integer getId() {
return this.id;
}
public void setId(final Integer id) {
this.id = id;
}
public boolean equals(final Object o) {
if (o == this) {
return true;
} else if (!(o instanceof User)) {
return false;
} else {
User other = (User)o;
if (!other.canEqual(this)) {
return false;
} else {
Object this$name = this.getName();
Object other$name = other.getName();
if (this$name == null) {
if (other$name != null) {
return false;
}
} else if (!this$name.equals(other$name)) {
return false;
}
Object this$id = this.getId();
Object other$id = other.getId();
if (this$id == null) {
if (other$id != null) {
return false;
}
} else if (!this$id.equals(other$id)) {
return false;
}
return true;
}
}
}
protected boolean canEqual(final Object other) {
return other instanceof User;
}
public int hashCode() {
int PRIME = true;
int result = 1;
Object $name = this.getName();
int result = result * 59 + ($name == null ? 43 : $name.hashCode());
Object $id = this.getId();
result = result * 59 + ($id == null ? 43 : $id.hashCode());
return result;
}
public String toString() {
return "User(name=" + this.getName() + ", id=" + this.getId() + ")";
}
}
二、@ApiOperation注解
实际项目中非常需要写文档,提高Java服务端和Web前端以及移动端的对接效率。
Swagger是当前最好用的Restful API文档生成的开源项目,通过swagger-spring项目实现了与SpingMVC框架的无缝集成功能,方便生成spring restful风格的接口文档,同时swagger-ui还可以测试spring restful风格的接口功能。
官方网站为:http://swagger.io/
1、@ApiOperation注解介绍
@ApiOperation不是spring自带的注解,而是swagger里的 —— com.wordnik.swagger.annotations.ApiOperation;
@ApiOperation和@ApiParam为添加的API相关注解,参数说明如下:
@ApiOperation(value = “接口说明”, httpMethod = “接口请求方式”, response = “接口返回参数类型”, notes = “接口发布说明”);其他参数可参考源码;
@ApiParam(required = “是否必须参数”, name = “参数名称”, value = “参数具体描述”)
2、Swagger与Spring MVC集成步骤
<dependency>
<groupId>com.mangofactory</groupId>
<artifactId>swagger-springmvc</artifactId>
<version>1.0.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.1.6.RELEASE</version>
</dependency>
(2)插件配置 CustomJavaPluginConfig
(3)复制swagger的相关js等静态资源到webapp目录。swagger-ui.js之类的。