最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot 2.x 整合Lombok的方法示例

 更新時(shí)間:2018年06月28日 14:45:57   作者:bladestone  
Spring Boot是非常高效的開(kāi)發(fā)框架,lombok是一套代碼模板解決方案,將極大提升開(kāi)發(fā)的效率,這篇文章主要介紹了SpringBoot 2.x 整合Lombok的方法示例,感興趣的小伙伴們可以參考一下

簡(jiǎn)介

lombok是一個(gè)編譯級(jí)別的插件,它可以在項(xiàng)目編譯的時(shí)候生成一些代碼。比如日常開(kāi)發(fā)過(guò)程中需要生產(chǎn)大量的JavaBean文件,每個(gè)JavaBean都需要提供大量的getset方法,如果字段較多且發(fā)生變動(dòng)的話修改起來(lái)相對(duì)繁瑣,相應(yīng)的lombok可以通過(guò)注解(@getter,@setter)為我們省去手動(dòng)創(chuàng)建gettersetter方法的麻煩,它能夠在我們編譯源碼的時(shí)候自動(dòng)幫我們生成gettersetter方法。

即它最終能夠達(dá)到的效果是:在源碼中沒(méi)有gettersetter方法,但是在編譯生成的字節(jié)碼文件中有gettersetter方法。

另外在項(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.fzitv.net/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)文章

  • Java結(jié)合redistemplate使用分布式鎖案例講解

    Java結(jié)合redistemplate使用分布式鎖案例講解

    在Java中使用RedisTemplate結(jié)合Redis來(lái)實(shí)現(xiàn)分布式鎖是一種常見(jiàn)的做法,特別適用于微服務(wù)架構(gòu)或多實(shí)例部署的應(yīng)用程序中,以確保數(shù)據(jù)的一致性和避免競(jìng)態(tài)條件,下面給大家分享使用Spring Boot和RedisTemplate實(shí)現(xiàn)分布式鎖的案例,感興趣的朋友一起看看吧
    2024-08-08
  • Jpa中Specification的求和sum不生效原理分析

    Jpa中Specification的求和sum不生效原理分析

    這篇文章主要為大家介紹了Jpa中Specification的求和sum不生效原理示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • Spring Boot常見(jiàn)外部配置文件方式詳析

    Spring Boot常見(jiàn)外部配置文件方式詳析

    這篇文章主要給大家介紹了關(guān)于Spring Boot常見(jiàn)外部配置文件方式的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用Spring Boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • springboot項(xiàng)目中沒(méi)有識(shí)別到y(tǒng)ml文件解決辦法

    springboot項(xiàng)目中沒(méi)有識(shí)別到y(tǒng)ml文件解決辦法

    這篇文章主要給大家介紹了springboot項(xiàng)目中沒(méi)有識(shí)別到y(tǒng)ml文件解決辦法,文中通過(guò)代碼示例給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-01-01
  • SpringCloud?Feign超詳細(xì)講解

    SpringCloud?Feign超詳細(xì)講解

    Feign是Netflix公司開(kāi)發(fā)的一個(gè)聲明式的REST調(diào)用客戶端;?Ribbon負(fù)載均衡、?Hystrⅸ服務(wù)熔斷是我們Spring?Cloud中進(jìn)行微服務(wù)開(kāi)發(fā)非?;A(chǔ)的組件,在使用的過(guò)程中我們也發(fā)現(xiàn)它們一般都是同時(shí)出現(xiàn)的,而且配置也都非常相似
    2022-10-10
  • Spring?Security用戶定義?

    Spring?Security用戶定義?

    這篇文章主要介紹了Spring?Security用戶定義,大家都知道?Spring?Security的用戶定義有很多方式,其實(shí)主要有兩種,基于內(nèi)存的和基于數(shù)據(jù)庫(kù)的,下面我給大家簡(jiǎn)單介紹一下這兩種方式,需要的朋友可以參考下
    2022-02-02
  • java8 filter方法、Predicate接口的使用方式

    java8 filter方法、Predicate接口的使用方式

    這篇文章主要介紹了java8 filter方法、Predicate接口的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Java?C++題解leetcode904水果成籃

    Java?C++題解leetcode904水果成籃

    這篇文章主要為大家介紹了Java?C++題解leetcode904水果成籃示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • Spring Bean初始化及銷毀多種實(shí)現(xiàn)方式

    Spring Bean初始化及銷毀多種實(shí)現(xiàn)方式

    這篇文章主要介紹了Spring Bean初始化及銷毀多種實(shí)現(xiàn)方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • MybatisPlus處理四種表與實(shí)體的映射及id自增策略分析

    MybatisPlus處理四種表與實(shí)體的映射及id自增策略分析

    在最近的工作中,碰到一個(gè)比較復(fù)雜的返回結(jié)果,發(fā)現(xiàn)簡(jiǎn)單映射已經(jīng)解決不了這個(gè)問(wèn)題了,只好去求助百度,學(xué)習(xí)mybatis表與實(shí)體的映射應(yīng)該怎么寫,將學(xué)習(xí)筆記結(jié)合工作碰到的問(wèn)題寫下本文,供自身查漏補(bǔ)缺,同時(shí)已被不時(shí)之需
    2022-10-10

最新評(píng)論

左贡县| 科技| 峡江县| 江华| 辰溪县| 宜章县| 汶川县| 龙口市| 淳化县| 松江区| 石城县| 镇原县| 乌兰浩特市| 山阴县| 濮阳县| 西华县| 晋宁县| 毕节市| 岑巩县| 江口县| 东方市| 舒兰市| 大城县| 澜沧| 拉萨市| 张家川| 哈巴河县| 盐亭县| 克什克腾旗| 平潭县| 静海县| 广安市| 昔阳县| 安塞县| 即墨市| 石河子市| 玉林市| 香港 | 札达县| 简阳市| 永清县|