基于Lombok集成springboot遇到的坑
Lombok集成springboot遇到的坑
最近有同事在spring boot中用Lombok @Data注解時遇到了一個奇怪的問題,然后有幸一起研究了一下,把研究成果記錄下來。
問題
先上代碼:
@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版本可以正常運行,但在2.0.3版本卻編譯錯誤。
Error:(13, 1) java: TestAbstract() 在 com.brotherj.learn.TestAbstract 中是private 訪問控制
查看了pom.xml文件后發(fā)現(xiàn)lombok的版本號是從spring boot繼承而來:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
然后又查看了spring boot pom.xml中的lombok版本號,發(fā)現(xiàn)從spring boot 2.0.3版本開始使用了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版本號之后,問題解決。
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
<version>1.16.20</version>
</dependency>
原因
問題解決后,決定研究一下具體的原因,由于Lombok只是依靠可插件化的Java自定義注解處理API(JSR 269: Pluggable Annotation Processing API)來實現(xiàn)在Javac編譯階段利用“Annotation Processor”對自定義的注解進行預(yù)處理后生成真正在JVM上面執(zhí)行的“Class文件”。
所以應(yīng)該時兩個版本下編譯生成的class文件不同,于是比較了一下兩個版本下編譯后的class文件。
public TestAbstract(RedisTemplate redisTemplate) {
this.redisTemplate = redisTemplate;
}
//1.16.22會生成一個private的構(gòu)造方法,而1.16.20不會生成
private TestAbstract() {
}
@Autowired
public TestChild(RedisTemplate redisTemplate) {
super(redisTemplate);
}
private TestChild() {
}
看到這里一切就都清楚了,是類加載順序?qū)е碌膯栴}。
先復(fù)習(xí)一下類加載順序:(靜態(tài)變量、靜態(tài)初始化塊)–>(變量、初始化塊)–> 構(gòu)造器。如果有父類,加載順序是:父類static方法 –> 子類static方法 –> 父類構(gòu)造方法- -> 子類構(gòu)造方法 。
也就是說,當(dāng)加載TestChild類時先加載類TestAbstract的構(gòu)造方法,而類TestAbstract的空參構(gòu)造為private,于是報了訪問控制的錯誤。
springboot引入Lombok
傳統(tǒng)的寫法,要寫一串串的get()、set()方法等等
現(xiàn)引入Lombok
pom.xml引入
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
引入后發(fā)現(xiàn),在實體類上面使用@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):
常見參數(shù)
@Setter注解在類或字段,注解在類時為所有字段生成setter方法,注解在字段上時只為該字段生成setter方法。@Getter使用方法同上,區(qū)別在于生成的是getter方法。@ToString注解在類,添加toString方法。@EqualsAndHashCode注解在類,生成hashCode和equals方法。@NoArgsConstructor注解在類,生成無參的構(gòu)造方法。@RequiredArgsConstructor注解在類,為類中需要特殊處理的字段生成構(gòu)造方法,比如final和被@NonNull注解的字段。@AllArgsConstructor注解在類,生成包含類中所有字段的構(gòu)造方法。@Data注解在類,為類的所有字段注解@ToString、@EqualsAndHashCode、@Getter的便捷方法,同時為所有非final字段注解@Setter。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java設(shè)計模式之工廠模式實現(xiàn)方法詳解
這篇文章主要介紹了Java設(shè)計模式之工廠模式實現(xiàn)方法,結(jié)合實例形式較為詳細的分析了工廠模式的分類、原理、實現(xiàn)方法與相關(guān)注意事項,需要的朋友可以參考下2017-12-12
關(guān)于Java Guava ImmutableMap不可變集合源碼分析
這篇文章主要介紹Java Guava不可變集合ImmutableMap的源碼分析的相關(guān)資料,需要的朋友可以參考下面具體的文章內(nèi)容2021-09-09
spring中jdbcTemplate.batchUpdate的幾種使用情況
本文主要介紹了spring中jdbcTemplate.batchUpdate的幾種使用情況,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04
SpringBoot連接Hive實現(xiàn)自助取數(shù)的示例
這篇文章主要介紹了SpringBoot連接Hive實現(xiàn)自助取數(shù)的示例,幫助大家更好的理解和使用springboot框架,感興趣的朋友可以了解下2020-12-12
Java如何使用HTTPclient訪問url獲得數(shù)據(jù)
這篇文章主要介紹了Java使用HTTPclient訪問url獲得數(shù)據(jù)的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09
SpringBoot接收接口入?yún)⒌姆绞叫〗Y(jié)
這篇文章主要給大家介紹了SpringBoot接收接口入?yún)⒌膸追N方式,我們從調(diào)用方的視角去看待這個問題,對調(diào)用方來說,它在調(diào)用接口時有好幾種傳參方式,下面,將會依次對這幾種參數(shù)方式進行講解和代碼示例,需要的朋友可以參考下2024-01-01

