Java中@RequiredArgsConstructor使用詳解
一、什么是@RequiredArgsConstructor?
@RequiredArgsConstructor是Lombok的一個(gè)注解,簡化了我們對(duì)@Autowired書寫,我們在寫Controller層或者Service層的時(shí)候,總是需要注入很多mapper接口或者service接口,如果每個(gè)接口都寫上@Autowired,這樣看起來就會(huì)很繁瑣,@RequiredArgsConstructor注解可以代替@Autowired注解
二、@RequiredArgsConstructor怎么使用?
2.1、導(dǎo)包
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.22</version> </dependency>
2.2、使用
將@RequiredArgsConstructor寫在類上面
注意點(diǎn)
1、聲明的變量必須加上final修飾
2、基于構(gòu)造方法為屬性賦值,容器通過調(diào)用類的構(gòu)造方法將其進(jìn)行依賴注入
三、@AllArgsConstructor和@RequiredArgsConstructor區(qū)別
1、@AllArgsConstructor 生成一個(gè)包含所有字段的構(gòu)造方法,如果使用了@Value注入,@Value注入會(huì)失效,原因是因?yàn)锧Value注解是通過對(duì)象的set方法賦值的,構(gòu)造方法的執(zhí)行還在set方法之前,所以在構(gòu)造方法中使用變量會(huì)變量為null。 2、@RequiredArgsConstructor會(huì)將類的每一個(gè)final字段或者non-null字段生成一個(gè)構(gòu)造方法 總結(jié): @AllArgsConstructor和@RequiredArgsConstructor都可以用來替代@Autowired寫法,區(qū)別在于@RequiredArgsConstructor必須要有final修飾,如果有@Value注解,@RequiredArgsConstructor修飾可以成功注入,@AllArgsConstructor修飾會(huì)注入失敗
四、@NoArgsConstructor、@RequiredArgsConstructor和@AllArgsConstructor
1、@NoArgsConstructor
@NoArgsConstructor將生成一個(gè)沒有參數(shù)的構(gòu)造函數(shù)。如果這是不可能的(因?yàn)樽罱K字段),將導(dǎo)致編譯器錯(cuò)誤,除非@NoArgsConstructor(force = true)使用,然后使用0/ false/ 初始化所有最終字段null。對(duì)于具有約束的字段(如@NonNull字段),不會(huì)生成任何檢查,因此請(qǐng)注意,在稍后正確初始化這些字段之前,通常不會(huì)滿足這些約束。某些java構(gòu)造(例如hibernate和Service Provider Interface)需要no-args構(gòu)造函數(shù)。此注釋主要與@Data生成注釋的其他構(gòu)造函數(shù)之一或其中一個(gè)結(jié)合使用。
2、@RequiredArgsConstructor
@RequiredArgsConstructor為每個(gè)需要特殊處理的字段生成一個(gè)帶有1個(gè)參數(shù)的構(gòu)造函數(shù)。所有未初始化的final字段都會(huì)獲得一個(gè)參數(shù),以及標(biāo)記為@NonNull在聲明它們的位置未初始化的任何字段。對(duì)于標(biāo)記有的字段@NonNull,還會(huì)生成顯式空檢查。構(gòu)造函數(shù)將拋出一個(gè)NullPointerExceptionif用于標(biāo)記為@NonNullcontains 的字段的任何參數(shù)null。參數(shù)的順序與字段在類中的顯示順序相匹配。
3、@AllArgsConstructor
@AllArgsConstructor為類中的每個(gè)字段生成一個(gè)帶有1個(gè)參數(shù)的構(gòu)造函數(shù)。標(biāo)記為@NonNull結(jié)果的字段將檢查這些參數(shù)。
4、總結(jié)
這些注釋中的每一個(gè)都允許使用替代形式,其中生成的構(gòu)造函數(shù)始終是私有的,并且生成包圍私有構(gòu)造函數(shù)的附加靜態(tài)工廠方法。通過提供staticName注釋的值來啟用此模式,如下所示:@RequiredArgsConstructor(staticName="of")。與普通構(gòu)造函數(shù)不同,這種靜態(tài)工廠方法將推斷泛型。這意味著您的API用戶可以寫入MapEntry.of("foo", 5)而不是更長時(shí)間new MapEntry<String, Integer>("foo", 5)。 要在生成的構(gòu)造函數(shù)上添加注釋,可以使用onConstructor=@__({@AnnotationsHere}),但要小心; 這是一個(gè)實(shí)驗(yàn)性功能。有關(guān)更多詳細(xì)信息,請(qǐng)參閱有關(guān)onX功能的文檔。 這些注釋會(huì)跳過靜態(tài)字段。 與大多數(shù)其他lombok注釋不同,顯式構(gòu)造函數(shù)的存在不會(huì)阻止這些注釋生成自己的構(gòu)造函數(shù)。這意味著您可以編寫自己的專用構(gòu)造函數(shù),并讓lombok生成樣板文件。如果出現(xiàn)沖突(您的一個(gè)構(gòu)造函數(shù)最終使用與lombok生成的簽名相同的簽名),則會(huì)發(fā)生編譯器錯(cuò)誤。
總結(jié)
到此這篇關(guān)于Java中@RequiredArgsConstructor使用詳解的文章就介紹到這了,更多相關(guān)@RequiredArgsConstructor詳解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- spring中的特殊注解@RequiredArgsConstructor詳解
- 使用@RequiredArgsConstructor注解來取代繁瑣的@Autowrired
- 解讀@NoArgsConstructor,@AllArgsConstructor,@RequiredArgsConstructor的區(qū)別及在springboot常用地方
- Java中的@RequiredArgsConstructor注解詳解
- Java中@RequiredArgsConstructor注解的基本用法
- @RequiredArgsConstructor如何實(shí)現(xiàn)構(gòu)造器注入
- springboot @RequiredArgsConstructor的概念與使用方式
相關(guān)文章
SpringBoot整合jasypt實(shí)現(xiàn)數(shù)據(jù)加密的步驟
聽說過jasypt嗎?它可是一個(gè)超級(jí)流行的Java庫哦,提供了簡單又高效的加密和解密接口,整合jasypt后,我們的SpringBoot應(yīng)用就能輕松處理敏感數(shù)據(jù)的加密和解密,而不必為復(fù)雜的加密算法頭疼啦,下面給大家介紹SpringBoot整合jasypt實(shí)現(xiàn)數(shù)據(jù)加密的步驟,感興趣的朋友一起看看吧2025-04-04spring framework體系結(jié)構(gòu)及模塊jar依賴關(guān)系詳解
在本篇文章里小編給大家整理的是關(guān)于spring framework體系結(jié)構(gòu)及模塊jar依賴關(guān)系,對(duì)此有興趣的朋友們可以學(xué)習(xí)下。2019-09-09Springboot項(xiàng)目打包如何將依賴的jar包輸出到指定目錄
公司要對(duì)springboot項(xiàng)目依賴的jar包進(jìn)行升級(jí),但是遇到一個(gè)問題,項(xiàng)目打包之后,沒辦法看到他里面依賴的jar包,版本到底是不是升上去了,沒辦法看到,下面通過本文給大家分享Springboot項(xiàng)目打包如何將依賴的jar包輸出到指定目錄,感興趣的朋友一起看看吧2024-05-05Java實(shí)現(xiàn)調(diào)用外部程序的示例代碼
本文主要介紹了Java實(shí)現(xiàn)調(diào)用外部程序的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05Java中Controller、Service、Dao/Mapper層的區(qū)別與用法
在Java開發(fā)中,通常會(huì)采用三層架構(gòu)(或稱MVC架構(gòu))來劃分程序的職責(zé)和功能,分別是Controller層、Service層、Dao/Mapper層,本文將詳細(xì)給大家介紹了三層的區(qū)別和用法,需要的朋友可以參考下2023-05-05