spring-boot 之Lombok的使用,通過註解來省略一些常用程式碼,set get 日誌等
阿新 • • 發佈:2018-10-31
如果使用IDEA要先安裝lombok外掛
三、注意:如果註解@Slf4j注入後找不到變數log,那就給IDE安裝lombok外掛,、 下面以idea為例
1、File → settings → Plugins, 然後點選“Browse repositories” 如圖
2、輸入 lombok 搜尋外掛, 點install安裝,安裝完重啟idea 這時候輸入 log就可以有提示了
IDEA新建spring boot工程,選擇Lombok
常用註解
- @Data 註解在類上;提供類所有屬性的 getting 和 setting 方法,此外還提供了equals、canEqual、hashCode、toString 方法
- @Setter :註解在屬性上;為屬性提供 setting 方法
- @Setter :註解在屬性上;為屬性提供 getting 方法
- @Slf4j:註解在類上;為類提供一個 屬性名為log 的 log4j 日誌物件
- @NoArgsConstructor :註解在類上;為類提供一個無參的構造方法
- @AllArgsConstructor :註解在類上;為類提供一個全參的構造方法
- @Cleanup : 可以關閉流
- @Builder : 被註解的類加個構造者模式
- @Synchronized : 加個同步鎖
- @SneakyThrows : 等同於try/catch 捕獲異常
- @NonNull : 如果給引數加個這個註解 引數為null會丟擲空指標異常
- @Value : 註解和@Data類似,區別在於它會把所有成員變數預設定義為private final修飾,並且不會生成set方法。
@NonNull 判空處理
package com.yanjun.mybatis.bean; import lombok.Data; import lombok.NoArgsConstructor; import lombok.NonNull; @Data @NoArgsConstructor public class User { public Integer age; @NonNull public String name; }
相當於
package com.yanjun.mybatis.bean;
import lombok.NonNull;
public class User {
public Integer age;
@NonNull
public String name;
public Integer getAge() {
return this.age;
}
@NonNull
public String getName() {
return this.name;
}
public void setAge(Integer age) {
this.age = age;
}
public void setName(@NonNull String name) {
if (name == null) {
throw new NullPointerException("name is marked @NonNull but is null");
} else {
this.name = name;
}
}
}
測試
User user = new User();
user.setName(null);
效果
Exception in thread "main" java.lang.NullPointerException: name is marked @NonNull but is null
at com.yanjun.mybatis.bean.User.setName(User.java:7)
at com.yanjun.mybatis.LombokApplication.main(LombokApplication.java:15)
@Data 提供 get、set 方法
package com.yanjun.mybatis.bean;
import lombok.Data;
@Data //自動生成 get、set 方法
public class User {
Integer id;
String name;
Integer age;
public static void main(String[] args) {
//測試方法
User user = new User();
user.setName("zhaoyanjun");
user.setAge(20);
user.setId(1);
}
}
@Slf4j 日誌列印
package com.yanjun.mybatis.bean;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
@Data //自動生成 get、set 方法
@Slf4j //日誌列印
public class User {
Integer id;
String name;
Integer age;
public static void main(String[] args) {
User user = new User();
user.setName("zhaoyanjun");
user.setAge(20);
user.setId(1);
log.info("日誌" + user.toString());
}
}
@AllArgsConstructor 全引數建構函式
package com.yanjun.mybatis.bean;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
@Data //自動生成 get、set 方法
@AllArgsConstructor //自動生成全引數建構函式
@Slf4j //日誌列印
public class User {
Integer id;
String name;
Integer age;
public static void main(String[] args) {
User user = new User(1, "zhaoyanjun", 20);
log.info("日誌" + user.toString());
}
}
@ToString 自動生成toString方法
package com.yanjun.mybatis.bean;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;
@Data //自動生成 get、set 方法
@AllArgsConstructor //自動生成全引數建構函式
@Slf4j //日誌列印
@ToString(of = {"id","age"}) //tostring() 方法裡面只打印 id ,name 欄位
public class User {
Integer id;
String name;
Integer age;
public static void main(String[] args) {
User user = new User(1, "zhaoyanjun", 20);
log.info("日誌" + user.toString());
}
}
toString() 方法排除欄位
//排除欄位
@ToString(exclude = {"name"}) //tostring() 方法中,name 欄位不參與列印
@Value 用於註解final類
@Value
註解和@Data
類似,區別在於它會把所有成員變數預設定義為 private final
修飾,並且不會生成set
方法。
package com.yanjun.mybatis.bean;
import lombok.Value;
@Value
public class User {
Integer id = 1;
String name = "zhaoyanjun";
Integer age = 3 ;
}
編譯後的程式碼
public final class User {
private final Integer id = 1;
private final String name = "zhaoyanjun";
private final Integer age = 3;
public User() {
}
public Integer getId() {
return this.id;
}
public String getName() {
this.getClass();
return "zhaoyanjun";
}
public Integer getAge() {
return this.age;
}
//省略部分程式碼
......
}
@Builder : 被註解的類加個構造者模式
import lombok.Builder;
@Builder
public class User {
public Integer id;
public String name;
public Integer age;
}
相當於以下程式碼
package com.yanjun.mybatis.bean;
public class User {
public Integer id;
public String name;
public Integer age;
User(Integer id, String name, Integer age) {
this.id = id;
this.name = name;
this.age = age;
}
public static User.UserBuilder builder() {
return new User.UserBuilder();
}
public static class UserBuilder {
private Integer id;
private String name;
private Integer age;
UserBuilder() {
}
public User.UserBuilder id(Integer id) {
this.id = id;
return this;
}
public User.UserBuilder name(String name) {
this.name = name;
return this;
}
public User.UserBuilder age(Integer age) {
this.age = age;
return this;
}
public User build() {
return new User(this.id, this.name, this.age);
}
public String toString() {
return "User.UserBuilder(id=" + this.id + ", name=" + this.name + ", age=" + this.age + ")";
}
}
}
使用
UserBuilder userBuilder = User.builder();
User user = userBuilder
.age(10)
.id(1)
.name("yanjun")
.build();
System.out.println(": " + userBuilder.toString());
@Synchronized : 加個同步鎖
package com.yanjun.mybatis.bean;
import lombok.Synchronized;
public class User {
public Integer age;
public String name;
//普通方法,相當於物件鎖
@Synchronized
int run1() {
return 1;
}
//靜態方法,相當於類鎖
@Synchronized
static int run2() {
return 2;
}
}
程式碼的效果相當於
public class User {
private final Object $lock = new Object[0];
private static final Object $LOCK = new Object[0];
public Integer age;
public String name;
public User() {
}
int run1() {
Object var1 = this.$lock;
synchronized(this.$lock) {
return 1;
}
}
static int run2() {
Object var0 = $LOCK;
synchronized($LOCK) {
return 2;
}
}
}