SpringBoot 2.x 整合Lombok的方法示例
簡介
lombok是一個編譯級別的插件,它可以在項目編譯的時候生成一些代碼。比如日常開發(fā)過程中需要生產大量的JavaBean文件,每個JavaBean都需要提供大量的get和set方法,如果字段較多且發(fā)生變動的話修改起來相對繁瑣,相應的lombok可以通過注解(@getter,@setter)為我們省去手動創(chuàng)建getter和setter方法的麻煩,它能夠在我們編譯源碼的時候自動幫我們生成getter和setter方法。
即它最終能夠達到的效果是:在源碼中沒有getter和setter方法,但是在編譯生成的字節(jié)碼文件中有getter和setter方法。
另外在項目開發(fā)階段,一個class的屬性是一直變化的,今天可能增加一個字段,明天可能刪除一個字段。每次變化都需要修改對應的模板代碼。另外,有的class的字段超級多,多到一眼看不完。如果加上模板代碼,更難一眼看出來。更有甚者,由于字段太多,想要使用builder來創(chuàng)建。手動創(chuàng)建builder和字段和原來的類夾雜在一起,看起來很凌亂。lombok的@Builder即可解決這個問題。
官網地址:https://projectlombok.org/
lombok最新版本號:http://jcenter.bintray.com/org/projectlombok/lombok/
官方文檔: https://projectlombok.org/features/all
lombok 注解介紹:http://www.dbjr.com.cn/article/151363.htm
安裝 lombok 插件

添加注解支持

添加依賴
buildscript {
ext {
springBootVersion = '2.0.2.RELEASE'
}
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
group = 'com.yanjun'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
compile('org.springframework.boot:spring-boot-starter',
'org.springframework.boot:spring-boot-starter-web',
)
//添加lombok依賴
compile 'org.projectlombok:lombok:1.18.0'
}
常用注解
- @Data 注解在類上;提供類所有屬性的 getting 和 setting 方法,此外還提供了equals、canEqual、hashCode、toString 方法
- @Setter :注解在屬性上;為屬性提供 setting 方法
- @Setter :注解在屬性上;為屬性提供 getting 方法
- @Log4j :注解在類上;為類提供一個 屬性名為log 的 log4j 日志對象
- @NoArgsConstructor :注解在類上;為類提供一個無參的構造方法
- @AllArgsConstructor :注解在類上;為類提供一個全參的構造方法
- @Cleanup : 可以關閉流
- @Builder : 被注解的類加個構造者模式
- @Synchronized : 加個同步鎖
- @SneakyThrows : 等同于try/catch 捕獲異常
- @NonNull : 如果給參數加個這個注解 參數為null會拋出空指針異常
- @Value : 注解和@Data類似,區(qū)別在于它會把所有成員變量默認定義為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類似,區(qū)別在于它會把所有成員變量默認定義為 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;
}
//靜態(tài)方法,相當于類鎖
@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;
}
}
}
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Spring Boot 與 Kotlin 使用Redis數據庫的配置方法
Redis是目前業(yè)界使用最廣泛的內存數據存儲。下面通過本文給大家介紹Spring Boot 與 Kotlin 使用Redis數據庫的配置方法,感興趣的朋友一起看看吧2018-01-01
SpringBoot利用自定義注解實現隱私數據脫敏(加密顯示)的解決方案
這兩天在整改等保測出的問題,里面有一個“用戶信息泄露”的風險項(就是后臺系統(tǒng)里用戶的一些隱私數據直接明文顯示了),其實指的就是要做數據脫敏,本文給大家介紹了SpringBoot利用自定義注解實現隱私數據脫敏(加密顯示)的解決方案,需要的朋友可以參考下2023-11-11
解決IDEA springboot"spring-boot-maven-plugin"報紅問題
這篇文章主要介紹了解決IDEA springboot"spring-boot-maven-plugin"報紅問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-04-04
關于springboot集成swagger及knife4j的增強問題
這篇文章主要介紹了springboot集成swagger以及knife4j的增強,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03

