網站首頁 編程語言 正文
@NoArgsConstructor、@AllArgsConstructor、@RequiredArgsConstructor的區別以及在springboot常用地方
作者:搏·夢 更新時間: 2022-05-25 編程語言文章目錄
- 1. 先說結論
- 2. 代碼解析區別
- 1. @AllArgsConstructor
- 2. @RequiredArgsConstructor
- 3. 場景使用---代替@Autowired注入bean對象
- 1. @AllArgsConstructor
- 2. @RequiredArgsConstructor
- 3. @RequiredArgsConstructor 與 @AllArgsConstructor 在注入bean上的區別
- 4. 總結
1. 先說結論
- 區別:
@NoArgsConstructor:生成無參的構造方法。
@AllArgsConstructor:生成該類下全部屬性的構造方法。
@RequiredArgsConstructor:生成該類下被final修飾或者non-null字段生成一個構造方法。 - 場景:
在springboot中,對于一個bean類,注入其他bean的時候,常見的是使用@Autowired,實際上也可以使用構造函數注入,這個時候就可以使用@AllArgsConstructor或者@RequiredArgsConstructor來代替。
2. 代碼解析區別
- @NoArgsConstructor 默認都知道。
- 若不知道怎么查看java反編譯字節碼內容,可以看一下:
Java 如何進行反編譯生成.java文件(javap、jad下載安裝使用)
1. @AllArgsConstructor
@AllArgsConstructor
public class demo {
private String name;
// 被final修飾
private final String age;
@NonNull
private String sex;
}
根據反編譯查看代碼:
public class demo
{
// 默認 只要是該類下的字段,無論什么修飾,都會被參與構造
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
{
// 只構造了有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
根據上面看反編譯代碼可以得出:只要是類里面字段,都會被加入到構造函數里面,不管被什么修飾。
例子:
@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:只會構造被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修飾。注:強調 對需要的字段,為什么要強調,請看下面的例子:
3. @RequiredArgsConstructor 與 @AllArgsConstructor 在注入bean上的區別
-
根據上面兩個例子,我們可以看出無論是那種方法都可以注入bean屬性對象,只是@RequiredArgsConstructor 是針對有條件的,沒有什么區別。
-
但如果是下面的需求呢:
在該類下,部分字段還需要使用@Value來注入值呢?@Component @ToString public class ConstructorDemo { private BeanTest1 beanTest1; @NonNull private BeanTest2 beanTest2; private BeanTest3 beanTest3; @Value("${constructor.name:hello}") private String name; } 先思考一下: 一個bean如果使用構造函數進行bean屬性注入,那么當然構造函數不能加上name。 因為加上,在創建ConstructorDemo該bean的時候,需要找類型為String,名字是name的bean對象,當然是不存在,必然會報錯。 因此,當然不能使用@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. 總結
- 上面只是舉例了代替@Autowired的例子,實際上在json轉化為對象,以及在spring中從配置文件讀取配置使用@ConfigurationProperties以及@ConstructorBinding的時候,都可以使用構造函數賦值,都可以用到上面的兩個@AllArgsConstructor、@RequiredArgsConstructor。
- 具體:只要記得,那些字段需要賦值,就把它列進構造方法的參數里面即可。
原文鏈接:https://blog.csdn.net/xueyijin/article/details/124618309
相關推薦
- 2022-11-26 React?useReducer終極使用教程_React
- 2022-05-11 解決 IntelliJ IDEA 中 .propertise 文件保存后中文亂碼
- 2022-09-03 Python中xlsx文件轉置操作詳解(行轉列和列轉行)_python
- 2022-10-14 SpringCloud組件之Feign遠程調用
- 2022-12-13 C++?Boost?Format超詳細講解_C 語言
- 2022-06-19 GO語言對數組切片去重的實現_Golang
- 2022-05-23 C語言也有封裝,繼承和多態你知道嗎_C 語言
- 2022-04-10 Blazor頁面組件用法介紹_基礎應用
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支