Lombok 通过提供简单的语法注解形式来帮助简化消除一些必须有但显得很臃肿的 java 代码。典型的是对于 POJO 对象的简化(如自动帮我们生成 Setter 和 Getter 等),有了 Lombok 的加持,开发人员可以免去很多重复且臃肿的操作,极大地提高 java 代码的信噪比,因此我们必须尝试并应用起来!
方法一:直接在 IDEA 界面中配置
上述安装完成以后需要重启 IDEA 生效!
方法二:手动下载 Lombok 插件安装
有时由于网络原因,上面方法一这种方式安装失败,因此只能手动下载安装
下载 lombok 插件: https://github.com/mplushnikov/lombok-intellij-plugin/releases
Plugins -> Install plugin from disk... 选择下载的 zip 包安装
IDE 中设置完成以后需要在 pom.xml 中添加如下所示的 lombok 依赖才能使用
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.16</version>
</dependency>
@Getter and @Setter
/ 自动为属性提供 Set 和 Get 方法@ToString
/ 该注解的作用是为类自动生成 toString()方法@EqualsAndHashCode
/ 为对象字段自动生成 hashCode 和 equals 实现@AllArgsConstructor, @RequiredArgsConstructor and @NoArgsConstructor
/ 顾名思义,为类自动生成对应参数的 constructor@Log, @Log4j, @Log4j2, @Slf4j, @XSlf4j, @CommonsLog, @JBossLog
/ 自动为类添加对应的 log 支持@Data
/ 自动为所有字段添加 @ToString, @EqualsAndHashCode, @Getter,为非 final 字段添加 @Setter,和 @RequiredArgsConstructor,本质上相当于几个注解的综合效果@NonNull
/ 自动帮助我们避免空指针。作用在方法参数上的注解,用于自动生成空值参数检查@Cleanup
/ 自动帮我们调用 close()方法。作用在局部变量上,在作用域结束时会自动调用 close 方法释放资源下文就 Lombok 中用的最为频繁的@Data
和@Log
注解进行代码实战!
官网关于 @Data 注解的解释如下:
All together now: A shortcut for @ToString, @EqualsAndHashCode, @Getter on all fields, @Setter on all non-final fields, and @RequiredArgsConstructor!
不难理解,其可以看成是多个 Lombok 注解的集成,因此使用很方便!
public class UserLombok {
private final String name;
private int age;
private double score;
private String[] tags;
public UserLombok(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
void setAge(int age) {
this.age = age;
}
public int getAge() {
return this.age;
}
public void setScore(double score) {
this.score = score;
}
public double getScore() {
return this.score;
}
public String[] getTags() {
return this.tags;
}
public void setTags(String[] tags) {
this.tags = tags;
}
@Override public String toString() {
return "DataExample(" + this.getName() + ", " + this.getAge() + ", " + this.getScore() + ", " + Arrays.deepToString(this.getTags()) + “)”;
}
protected boolean canEqual(Object other) {
return other instanceof DataExample;
}
@Override public boolean equals(Object o) {
if (o == this) return true;
if (!(o instanceof DataExample)) return false;
DataExample other = (DataExample) o;
if (!other.canEqual((Object)this)) return false;
if (this.getName() == null ? other.getName() != null : !this.getName().equals(other.getName())) return false;
if (this.getAge() != other.getAge()) return false;
if (Double.compare(this.getScore(), other.getScore()) != 0) return false;
if (!Arrays.deepEquals(this.getTags(), other.getTags())) return false;
return true;
}
@Override public int hashCode() {
final int PRIME = 59;
int result = 1;
final long temp1 = Double.doubleToLongBits(this.getScore());
result = (result*PRIME) + (this.getName() == null ? 43 : this.getName().hashCode());
result = (result*PRIME) + this.getAge();
result = (result*PRIME) + (int)(temp1 ^ (temp1 >>> 32));
result = (result*PRIME) + Arrays.deepHashCode(this.getTags());
return result;
}
}
@Data
public class UserLombok {
private final String name;
private int age;
private double score;
private String[] tags;
}
在 IDEA 中使用时,Lombok 的注解会自动补全,如下图所示:
public static void main( String[] args ) {
UserLombok userLombok = new UserLombok("hansonwang99 ”);
userLombok.setAge(18);
String[] array = new String[]{"apple","juice ”};
userLombok.setTags( array );
userLombok.setScore( 99.0 );
System.out.println(userLombok);
}
由下图我们可以看到 IDEA 依然可以自动为我们补全由 Lombok 自动生成的代码:
由于 Lombok 为我们自动生成了 toString 方法,因此对象的打印结果如下:
UserLombok(name=hansonwang99, age=18, score=99.0, tags=[apple, juice])
在我的文章 Spring Boot 日志框架实践 一文中,我们使用 Log4j2 来作为日志对象,其写法如下:
@RestController
@RequestMapping("/testlogging ”)
public class LoggingTestController {
private final Logger logger = LogManager.getLogger(this.getClass());
@GetMapping("/hello ”)
public String hello() {
for(int i=0;i<10_0000;i++){
logger.info("info execute index method ”);
logger.warn("warn execute index method ”);
logger.error("error execute index method ”);
}
return "My First SpringBoot Application ”;
}
}
若改用 Lombok 后,写法变得更加简洁,我们只需要引入对应的 @Log 注解即可完成 log 对象的生成:
@RestController
@RequestMapping("/testloggingwithlombok ”)
@Log4j2
public class LoggingTestControllerLombok {
@GetMapping("/hello ”)
public String hello() {
for(int i=0;i<10_0000;i++){
log.info("info execute index method ”);
log.warn("warn execute index method ”);
log.error("error execute index method ”);
}
return "My First SpringBoot Application ”;
}
}
怎么样,是不是一切都是那么地优雅!
更多关于 SpringBoot 的文章:
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.