網(wǎng)站首頁 編程語言 正文
@NoArgsConstructor、@AllArgsConstructor、@RequiredArgsConstructor的區(qū)別以及在springboot常用地方
作者:搏·夢 更新時間: 2022-05-25 編程語言文章目錄
- 1. 先說結(jié)論
- 2. 代碼解析區(qū)別
- 1. @AllArgsConstructor
- 2. @RequiredArgsConstructor
- 3. 場景使用---代替@Autowired注入bean對象
- 1. @AllArgsConstructor
- 2. @RequiredArgsConstructor
- 3. @RequiredArgsConstructor 與 @AllArgsConstructor 在注入bean上的區(qū)別
- 4. 總結(jié)
1. 先說結(jié)論
- 區(qū)別:
@NoArgsConstructor:生成無參的構(gòu)造方法。
@AllArgsConstructor:生成該類下全部屬性的構(gòu)造方法。
@RequiredArgsConstructor:生成該類下被final修飾或者non-null字段生成一個構(gòu)造方法。 - 場景:
在springboot中,對于一個bean類,注入其他bean的時候,常見的是使用@Autowired,實際上也可以使用構(gòu)造函數(shù)注入,這個時候就可以使用@AllArgsConstructor或者@RequiredArgsConstructor來代替。
2. 代碼解析區(qū)別
- @NoArgsConstructor 默認(rèn)都知道。
- 若不知道怎么查看java反編譯字節(jié)碼內(nèi)容,可以看一下:
Java 如何進行反編譯生成.java文件(javap、jad下載安裝使用)
1. @AllArgsConstructor
@AllArgsConstructor
public class demo {
private String name;
// 被final修飾
private final String age;
@NonNull
private String sex;
}
根據(jù)反編譯查看代碼:
public class demo
{
// 默認(rèn) 只要是該類下的字段,無論什么修飾,都會被參與構(gòu)造
public demo(String name, String age, String sex)
{
if(sex == null)
{
throw new NullPointerException("sex is marked non-null but is null");
} else
{
this.name = name;
this.age = age;
this.sex = sex;
return;
}
}
private String name;
private final String age;
private String sex;
}
2. @RequiredArgsConstructor
@RequiredArgsConstructor
public class demo {
private String name;
// 被final修飾
private final String age;
@NonNull
private String sex;
}
反編譯代碼:
public class demo
{
// 只構(gòu)造了有final或者no-null修飾的字段
public demo(String age, String sex)
{
if(sex == null)
{
throw new NullPointerException("sex is marked non-null but is null");
} else
{
this.age = age;
this.sex = sex;
return;
}
}
private String name;
private final String age;
private String sex;
}
這是源碼的英文解釋:
3. 場景使用—代替@Autowired注入bean對象
1. @AllArgsConstructor
根據(jù)上面看反編譯代碼可以得出:只要是類里面字段,都會被加入到構(gòu)造函數(shù)里面,不管被什么修飾。
例子:
@Component
public class BeanTest1 {
}
@Component
public class BeanTest2 {
}
@Component
public class BeanTest3 {
}
@Component
@AllArgsConstructor
@ToString
public class ConstructorDemo {
// 注入三個bean對象,完全沒有使用Autowired注解
private BeanTest1 beanTest1;
@NonNull
private BeanTest2 beanTest2;
private final BeanTest3 beanTest3;
}
// 這只是個測試類
@Component
public class ConstructorRunner implements ApplicationRunner {
@Autowired
ConstructorDemo ConstructorDemo;
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println(ConstructorDemo);
}
}
完完全全可以注入bean對象。
2. @RequiredArgsConstructor
RequiredArgsConstructor:只會構(gòu)造被final修飾或者no-null修飾的字段。
// 改成@RequiredArgsConstructor
@Component
@RequiredArgsConstructor
@ToString
public class ConstructorDemo {
private BeanTest1 beanTest1;
@NonNull
private BeanTest2 beanTest2;
private final BeanTest3 beanTest3;
}
由圖可以看出,沒有被修飾final或者no-null的屬性無法被注入,因此,建議使用@RequiredArgsConstructor的時候,對需要的字段加上final修飾。注:強調(diào) 對需要的字段,為什么要強調(diào),請看下面的例子:
3. @RequiredArgsConstructor 與 @AllArgsConstructor 在注入bean上的區(qū)別
-
根據(jù)上面兩個例子,我們可以看出無論是那種方法都可以注入bean屬性對象,只是@RequiredArgsConstructor 是針對有條件的,沒有什么區(qū)別。
-
但如果是下面的需求呢:
在該類下,部分字段還需要使用@Value來注入值呢?@Component @ToString public class ConstructorDemo { private BeanTest1 beanTest1; @NonNull private BeanTest2 beanTest2; private BeanTest3 beanTest3; @Value("${constructor.name:hello}") private String name; } 先思考一下: 一個bean如果使用構(gòu)造函數(shù)進行bean屬性注入,那么當(dāng)然構(gòu)造函數(shù)不能加上name。 因為加上,在創(chuàng)建ConstructorDemo該bean的時候,需要找類型為String,名字是name的bean對象,當(dāng)然是不存在,必然會報錯。 因此,當(dāng)然不能使用@AllArgsConstructor了,只能使用@RequiredArgsConstructor
-
@AllArgsConstructor例子:
@Component @ToString @AllArgsConstructor public class ConstructorDemo { private BeanTest1 beanTest1; @NonNull private BeanTest2 beanTest2; private BeanTest3 beanTest3; @Value("${constructor.name:hello}") private String name; }
-
@RequiredArgsConstructor的例子
@Component @ToString @RequiredArgsConstructor public class ConstructorDemo { // 肯定為null,因為沒有final或者no-null修飾 private BeanTest1 beanTest1; @NonNull private BeanTest2 beanTest2; private final BeanTest3 beanTest3; @Value("${constructor.name:hello}") private String name; }
4. 總結(jié)
- 上面只是舉例了代替@Autowired的例子,實際上在json轉(zhuǎn)化為對象,以及在spring中從配置文件讀取配置使用@ConfigurationProperties以及@ConstructorBinding的時候,都可以使用構(gòu)造函數(shù)賦值,都可以用到上面的兩個@AllArgsConstructor、@RequiredArgsConstructor。
- 具體:只要記得,那些字段需要賦值,就把它列進構(gòu)造方法的參數(shù)里面即可。
原文鏈接:https://blog.csdn.net/xueyijin/article/details/124618309
相關(guān)推薦
- 2022-06-25 C++文件讀寫操作詳解_C 語言
- 2023-01-01 十個驚艷的Pythonic單行代碼_python
- 2022-04-19 Python的進程間通信詳解_python
- 2022-11-08 goalng?結(jié)構(gòu)體?方法集?接口實例詳解_Golang
- 2022-10-13 解析React中useMemo與useCallback的區(qū)別_React
- 2023-07-04 JUC阻塞隊列BlockingQueue---LinkedBlockingQueue
- 2022-12-27 刪除Helm使用時關(guān)于kubernetes文件的警告問題_云其它
- 2022-05-29 Docker向數(shù)據(jù)卷Volume寫入數(shù)據(jù)_docker
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支