SpringBoot 2.x 整合Lombok的方法示例
簡(jiǎn)介
lombok
是一個(gè)編譯級(jí)別的插件,它可以在項(xiàng)目編譯的時(shí)候生成一些代碼。比如日常開(kāi)發(fā)過(guò)程中需要生產(chǎn)大量的JavaBean
文件,每個(gè)JavaBean
都需要提供大量的get
和set
方法,如果字段較多且發(fā)生變動(dòng)的話修改起來(lái)相對(duì)繁瑣,相應(yīng)的lombok
可以通過(guò)注解(@getter,@setter)
為我們省去手動(dòng)創(chuàng)建getter
和setter
方法的麻煩,它能夠在我們編譯源碼的時(shí)候自動(dòng)幫我們生成getter
和setter
方法。
即它最終能夠達(dá)到的效果是:在源碼中沒(méi)有getter
和setter
方法,但是在編譯生成的字節(jié)碼文件中有getter
和setter
方法。
另外在項(xiàng)目開(kāi)發(fā)階段,一個(gè)class
的屬性是一直變化的,今天可能增加一個(gè)字段,明天可能刪除一個(gè)字段。每次變化都需要修改對(duì)應(yīng)的模板代碼。另外,有的class
的字段超級(jí)多,多到一眼看不完。如果加上模板代碼,更難一眼看出來(lái)。更有甚者,由于字段太多,想要使用builder
來(lái)創(chuàng)建。手動(dòng)創(chuàng)建builder
和字段和原來(lái)的類夾雜在一起,看起來(lái)很凌亂。lombok
的@Builder
即可解決這個(gè)問(wèn)題。
官網(wǎng)地址:https://projectlombok.org/
lombok最新版本號(hào):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 :注解在類上;為類提供一個(gè) 屬性名為log 的 log4j 日志對(duì)象
- @NoArgsConstructor :注解在類上;為類提供一個(gè)無(wú)參的構(gòu)造方法
- @AllArgsConstructor :注解在類上;為類提供一個(gè)全參的構(gòu)造方法
- @Cleanup : 可以關(guān)閉流
- @Builder : 被注解的類加個(gè)構(gòu)造者模式
- @Synchronized : 加個(gè)同步鎖
- @SneakyThrows : 等同于try/catch 捕獲異常
- @NonNull : 如果給參數(shù)加個(gè)這個(gè)注解 參數(shù)為null會(huì)拋出空指針異常
- @Value : 注解和@Data類似,區(qū)別在于它會(huì)把所有成員變量默認(rèn)定義為private final修飾,并且不會(huì)生成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; }
相當(dāng)于
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; } } }
測(cè)試
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 //自動(dòng)生成 get、set 方法 public class User { Integer id; String name; Integer age; public static void main(String[] args) { //測(cè)試方法 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 //自動(dòng)生成 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 全參數(shù)構(gòu)造函數(shù)
package com.yanjun.mybatis.bean; import lombok.AllArgsConstructor; import lombok.Data; import lombok.extern.slf4j.Slf4j; @Data //自動(dòng)生成 get、set 方法 @AllArgsConstructor //自動(dòng)生成全參數(shù)構(gòu)造函數(shù) @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 自動(dòng)生成toString方法
package com.yanjun.mybatis.bean; import lombok.AllArgsConstructor; import lombok.Data; import lombok.ToString; import lombok.extern.slf4j.Slf4j; @Data //自動(dòng)生成 get、set 方法 @AllArgsConstructor //自動(dòng)生成全參數(shù)構(gòu)造函數(shù) @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ū)別在于它會(huì)把所有成員變量默認(rèn)定義為 private final
修飾,并且不會(huì)生成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 : 被注解的類加個(gè)構(gòu)造者模式
import lombok.Builder; @Builder public class User { public Integer id; public String name; public Integer age; }
相當(dāng)于以下代碼
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 : 加個(gè)同步鎖
package com.yanjun.mybatis.bean; import lombok.Synchronized; public class User { public Integer age; public String name; //普通方法,相當(dāng)于對(duì)象鎖 @Synchronized int run1() { return 1; } //靜態(tài)方法,相當(dāng)于類鎖 @Synchronized static int run2() { return 2; } }
代碼的效果相當(dāng)于
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; } } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Elasticsearch索引庫(kù)和文檔的相關(guān)操作詳細(xì)指南
這篇文章主要給大家介紹了關(guān)于Elasticsearch索引庫(kù)和文檔的相關(guān)操作的相關(guān)資料,Elasticsearch是用Java開(kāi)發(fā)并且是當(dāng)前最流行的開(kāi)源的企業(yè)級(jí)搜索引擎,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11Java的List集合框架之LinkedList詳細(xì)解析
這篇文章主要介紹了Java的List集合框架之LinkedList詳細(xì)解析,LinkedList底層是內(nèi)部Node類的存儲(chǔ),prev、next、item值,同時(shí)最外層還有first、last節(jié)點(diǎn),需要的朋友可以參考下2023-11-11Spring Boot 與 Kotlin 使用Redis數(shù)據(jù)庫(kù)的配置方法
Redis是目前業(yè)界使用最廣泛的內(nèi)存數(shù)據(jù)存儲(chǔ)。下面通過(guò)本文給大家介紹Spring Boot 與 Kotlin 使用Redis數(shù)據(jù)庫(kù)的配置方法,感興趣的朋友一起看看吧2018-01-01spring boot補(bǔ)習(xí)系列之幾種scope詳解
這篇文章主要給大家介紹了關(guān)于spring boot補(bǔ)習(xí)系列之幾種scope的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用spring boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-07-07SpringBoot利用自定義注解實(shí)現(xiàn)隱私數(shù)據(jù)脫敏(加密顯示)的解決方案
這兩天在整改等保測(cè)出的問(wèn)題,里面有一個(gè)“用戶信息泄露”的風(fēng)險(xiǎn)項(xiàng)(就是后臺(tái)系統(tǒng)里用戶的一些隱私數(shù)據(jù)直接明文顯示了),其實(shí)指的就是要做數(shù)據(jù)脫敏,本文給大家介紹了SpringBoot利用自定義注解實(shí)現(xiàn)隱私數(shù)據(jù)脫敏(加密顯示)的解決方案,需要的朋友可以參考下2023-11-11Java實(shí)現(xiàn)企業(yè)發(fā)放的獎(jiǎng)金根據(jù)利潤(rùn)提成問(wèn)題
這篇文章主要介紹了請(qǐng)利用數(shù)軸來(lái)分界,定位。注意定義時(shí)需把獎(jiǎng)金定義成長(zhǎng)整型,需要的朋友可以參考下2017-02-02解決IDEA springboot"spring-boot-maven-plugin"報(bào)紅問(wèn)題
這篇文章主要介紹了解決IDEA springboot"spring-boot-maven-plugin"報(bào)紅問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04關(guān)于springboot集成swagger及knife4j的增強(qiáng)問(wèn)題
這篇文章主要介紹了springboot集成swagger以及knife4j的增強(qiáng),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03