欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于Lombok集成springboot遇到的坑

 更新時(shí)間:2021年12月01日 10:09:21   作者:Jagger-Wang  
這篇文章主要介紹了Lombok集成springboot遇到的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Lombok集成springboot遇到的坑

最近有同事在spring boot中用Lombok @Data注解時(shí)遇到了一個(gè)奇怪的問(wèn)題,然后有幸一起研究了一下,把研究成果記錄下來(lái)。

問(wèn)題

先上代碼:

@Data
public abstract class TestAbstract {
    private RedisTemplate redisTemplate;
    public TestAbstract(RedisTemplate redisTemplate) {
        this.redisTemplate = redisTemplate;
    }
}
@Data
public class TestChild extends TestAbstract {
    @Autowired
    public TestChild(RedisTemplate redisTemplate) {
        super(redisTemplate);
    }
}

上面的代碼在spring boot 2.0.2版本可以正常運(yùn)行,但在2.0.3版本卻編譯錯(cuò)誤。

Error:(13, 1) java: TestAbstract() 在 com.brotherj.learn.TestAbstract 中是private 訪問(wèn)控制

查看了pom.xml文件后發(fā)現(xiàn)lombok的版本號(hào)是從spring boot繼承而來(lái):

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

然后又查看了spring boot pom.xml中的lombok版本號(hào),發(fā)現(xiàn)從spring boot 2.0.3版本開(kāi)始使用了lombok 1.16.22,而2.0.2版本使用的是1.16.20版本。

#2.0.2
<lombok.version>1.16.20</lombok.version>

#2.0.3
<lombok.version>1.16.22</lombok.version>

于是修改pom.xml版本號(hào)之后,問(wèn)題解決。

 <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
    <version>1.16.20</version>
</dependency>

原因

問(wèn)題解決后,決定研究一下具體的原因,由于Lombok只是依靠可插件化的Java自定義注解處理API(JSR 269: Pluggable Annotation Processing API)來(lái)實(shí)現(xiàn)在Javac編譯階段利用“Annotation Processor”對(duì)自定義的注解進(jìn)行預(yù)處理后生成真正在JVM上面執(zhí)行的“Class文件”。

所以應(yīng)該時(shí)兩個(gè)版本下編譯生成的class文件不同,于是比較了一下兩個(gè)版本下編譯后的class文件。

    public TestAbstract(RedisTemplate redisTemplate) {
        this.redisTemplate = redisTemplate;
    }
    //1.16.22會(huì)生成一個(gè)private的構(gòu)造方法,而1.16.20不會(huì)生成
    private TestAbstract() {
    }

     @Autowired
    public TestChild(RedisTemplate redisTemplate) {
        super(redisTemplate);
    }
    private TestChild() {
    }

看到這里一切就都清楚了,是類(lèi)加載順序?qū)е碌膯?wèn)題。

先復(fù)習(xí)一下類(lèi)加載順序:(靜態(tài)變量、靜態(tài)初始化塊)–>(變量、初始化塊)–> 構(gòu)造器。如果有父類(lèi),加載順序是:父類(lèi)static方法 –> 子類(lèi)static方法 –> 父類(lèi)構(gòu)造方法- -> 子類(lèi)構(gòu)造方法 。

也就是說(shuō),當(dāng)加載TestChild類(lèi)時(shí)先加載類(lèi)TestAbstract的構(gòu)造方法,而類(lèi)TestAbstract的空參構(gòu)造為private,于是報(bào)了訪問(wèn)控制的錯(cuò)誤。

springboot引入Lombok

傳統(tǒng)的寫(xiě)法,要寫(xiě)一串串的get()、set()方法等等

現(xiàn)引入Lombok

pom.xml引入

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>

引入后發(fā)現(xiàn),在實(shí)體類(lèi)上面使用@Data找不到import的包

網(wǎng)上巴拉巴拉,發(fā)現(xiàn)是springBoot的版本和import的版本不統(tǒng)一,加上

<optional>true</optional>

提示版本信息,改為可用的版本即可。修正后如下:

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
    <version>1.18.2</version>
</dependency>

終于可以正常導(dǎo)入^_^

延伸閱讀(1):

idea安裝Lombok插件

File——Settings——Plugins——Marketplact

延伸閱讀(2):

常見(jiàn)參數(shù)

  • @Setter 注解在類(lèi)或字段,注解在類(lèi)時(shí)為所有字段生成setter方法,注解在字段上時(shí)只為該字段生成setter方法。
  • @Getter 使用方法同上,區(qū)別在于生成的是getter方法。
  • @ToString 注解在類(lèi),添加toString方法。
  • @EqualsAndHashCode 注解在類(lèi),生成hashCode和equals方法。
  • @NoArgsConstructor 注解在類(lèi),生成無(wú)參的構(gòu)造方法。
  • @RequiredArgsConstructor 注解在類(lèi),為類(lèi)中需要特殊處理的字段生成構(gòu)造方法,比如final和被@NonNull注解的字段。
  • @AllArgsConstructor 注解在類(lèi),生成包含類(lèi)中所有字段的構(gòu)造方法。
  • @Data 注解在類(lèi),為類(lèi)的所有字段注解@ToString、@EqualsAndHashCode、@Getter的便捷方法,同時(shí)為所有非final字段注解@Setter。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java?同步工具與組合類(lèi)的線程安全性解析

    Java?同步工具與組合類(lèi)的線程安全性解析

    這篇文章主要介紹了Java?同步工具與組合類(lèi)的線程安全性解析,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • Java實(shí)現(xiàn)九宮格的簡(jiǎn)單實(shí)例

    Java實(shí)現(xiàn)九宮格的簡(jiǎn)單實(shí)例

    這篇文章主要介紹了 Java實(shí)現(xiàn)九宮格的簡(jiǎn)單實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • Response.AddHeader案例講解

    Response.AddHeader案例講解

    這篇文章主要介紹了Response.AddHeader案例講解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Java比較對(duì)象大小兩種常用方法

    Java比較對(duì)象大小兩種常用方法

    這篇文章主要介紹了Java比較對(duì)象大小兩種常用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • 教你用java?stream對(duì)集合中的對(duì)象按指定字段進(jìn)行分組并統(tǒng)計(jì)

    教你用java?stream對(duì)集合中的對(duì)象按指定字段進(jìn)行分組并統(tǒng)計(jì)

    這篇文章主要給大家介紹了關(guān)于用java?stream對(duì)集合中的對(duì)象按指定字段進(jìn)行分組并統(tǒng)計(jì)的相關(guān)資料,本文主要介紹了如何利用Java的Stream流來(lái)實(shí)現(xiàn)在list集合中,對(duì)具有相同name屬性的對(duì)象進(jìn)行匯總計(jì)算的需求,需要的朋友可以參考下
    2024-10-10
  • Java利用遞歸實(shí)現(xiàn)樹(shù)形結(jié)構(gòu)的工具類(lèi)

    Java利用遞歸實(shí)現(xiàn)樹(shù)形結(jié)構(gòu)的工具類(lèi)

    有時(shí)候,我們的數(shù)據(jù)是帶有層級(jí)的,比如常見(jiàn)的省市區(qū)三級(jí)聯(lián)動(dòng),就是一層套著一層。而我們?cè)跀?shù)據(jù)庫(kù)存放數(shù)據(jù)的時(shí)候,往往是列表形式的,這個(gè)時(shí)候可能就需要遞歸處理為樹(shù)形結(jié)構(gòu)了。本文就為大家介紹了Java利用遞歸實(shí)現(xiàn)樹(shù)形結(jié)構(gòu)的工具類(lèi),希望對(duì)大家有所幫助
    2023-03-03
  • 深入了解JAVA泛型

    深入了解JAVA泛型

    這篇文章主要介紹了JAVA泛型的相關(guān)知識(shí),文中代碼非常詳細(xì),供大家參考和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • javaweb實(shí)戰(zhàn)之商城項(xiàng)目開(kāi)發(fā)(三)

    javaweb實(shí)戰(zhàn)之商城項(xiàng)目開(kāi)發(fā)(三)

    這篇文章主要針對(duì)javaweb商城項(xiàng)目開(kāi)發(fā)進(jìn)行實(shí)戰(zhàn)演習(xí),主要實(shí)現(xiàn)通用的BaseDao.java和使用resultMap映射關(guān)聯(lián)對(duì)象,感興趣的小伙伴們可以參考一下
    2016-02-02
  • SpringBoot之@Value獲取application.properties配置無(wú)效的解決

    SpringBoot之@Value獲取application.properties配置無(wú)效的解決

    這篇文章主要介紹了SpringBoot之@Value獲取application.properties配置無(wú)效的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Mybatis源碼解析之事務(wù)管理

    Mybatis源碼解析之事務(wù)管理

    大家好,本篇文章主要講的是Mybatis源碼解析之事務(wù)管理,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12

最新評(píng)論