最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解讀@NoArgsConstructor,@AllArgsConstructor,@RequiredArgsConstructor的區(qū)別及在springboot常用地方

 更新時(shí)間:2023年12月15日 14:25:45   作者:搏·夢(mèng)  
這篇文章主要介紹了解讀@NoArgsConstructor,@AllArgsConstructor,@RequiredArgsConstructor的區(qū)別及在springboot常用地方,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

1. 先說結(jié)論

區(qū)別

  • @NoArgsConstructor:生成無參的構(gòu)造方法。
  • @AllArgsConstructor:生成該類下全部屬性的構(gòu)造方法。
  • @RequiredArgsConstructor:生成該類下被final修飾或者non-null字段生成一個(gè)構(gòu)造方法。

場(chǎng)景

在springboot中,對(duì)于一個(gè)bean類,注入其他bean的時(shí)候,常見的是使用@Autowired,實(shí)際上也可以使用構(gòu)造函數(shù)注入,這個(gè)時(shí)候就可以使用@AllArgsConstructor或者@RequiredArgsConstructor來代替。

2. 代碼解析區(qū)別

@NoArgsConstructor 默認(rèn)都知道。

若不知道怎么查看java反編譯字節(jié)碼內(nèi)容,可以看一下:

Java如何進(jìn)行反編譯生成.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) 只要是該類下的字段,無論什么修飾,都會(huì)被參與構(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. 場(chǎng)景使用—代替@Autowired注入bean對(duì)象

1. @AllArgsConstructor

根據(jù)上面看反編譯代碼可以得出:只要是類里面字段,都會(huì)被加入到構(gòu)造函數(shù)里面,不管被什么修飾。

例子:

@Component
public class BeanTest1 {
}

@Component
public class BeanTest2 {
}

@Component
public class BeanTest3 {
}

@Component
@AllArgsConstructor
@ToString
public class ConstructorDemo {
	// 注入三個(gè)bean對(duì)象,完全沒有使用Autowired注解
    private BeanTest1 beanTest1;

    @NonNull
    private BeanTest2 beanTest2;

    private final BeanTest3 beanTest3;
}

// 這只是個(gè)測(cè)試類
@Component
public class ConstructorRunner implements ApplicationRunner {

    @Autowired
   ConstructorDemo ConstructorDemo;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println(ConstructorDemo);
    }
}

完完全全可以注入bean對(duì)象。

2. @RequiredArgsConstructor

RequiredArgsConstructor:只會(huì)構(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的時(shí)候,對(duì)需要的字段加上final修飾。

注:強(qiáng)調(diào) 對(duì)需要的字段,為什么要強(qiáng)調(diào),請(qǐng)看下面的例子:

3. @RequiredArgsConstructor與@AllArgsConstructor在注入bean上區(qū)別

根據(jù)上面兩個(gè)例子,我們可以看出無論是那種方法都可以注入bean屬性對(duì)象,只是@RequiredArgsConstructor 是針對(duì)有條件的,沒有什么區(qū)別。

但如果是下面的需求呢:

在該類下,部分字段還需要使用@Value來注入值呢?

@Component
@ToString
public class ConstructorDemo {

    private BeanTest1 beanTest1;

    @NonNull
    private BeanTest2 beanTest2;

    private BeanTest3 beanTest3;

    @Value("${constructor.name:hello}")
    private String name;
    
}

先思考一下:

一個(gè)bean如果使用構(gòu)造函數(shù)進(jìn)行bean屬性注入,那么當(dāng)然構(gòu)造函數(shù)不能加上name。

因?yàn)榧由?,在?chuàng)建ConstructorDemo該bean的時(shí)候,需要找類型為String,名字是name的bean對(duì)象,當(dāng)然是不存在,必然會(huì)報(bào)錯(cuò)。

因此,當(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,因?yàn)闆]有final或者no-null修飾
    private BeanTest1 beanTest1;

    @NonNull
    private BeanTest2 beanTest2;

    private final BeanTest3 beanTest3;

    @Value("${constructor.name:hello}")
    private String name;
}

4. 總結(jié)

上面只是舉例了代替@Autowired的例子,實(shí)際上在json轉(zhuǎn)化為對(duì)象,以及在spring中從配置文件讀取配置使用@ConfigurationProperties以及@ConstructorBinding的時(shí)候,都可以使用構(gòu)造函數(shù)賦值,都可以用到上面的兩個(gè)@AllArgsConstructor、@RequiredArgsConstructor。

具體:只要記得,那些字段需要賦值,就把它列進(jìn)構(gòu)造方法的參數(shù)里面即可。

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

相關(guān)文章

  • Java類加載器和類加載機(jī)制實(shí)例分析

    Java類加載器和類加載機(jī)制實(shí)例分析

    這篇文章主要介紹了Java類加載器和類加載機(jī)制,結(jié)合實(shí)例形式分析了java類加載器與類加載機(jī)制原理、實(shí)現(xiàn)方法及相關(guān)操作技巧,需要的朋友可以參考下
    2019-07-07
  • Servlet機(jī)制Pushlet原理及用法詳解

    Servlet機(jī)制Pushlet原理及用法詳解

    這篇文章主要介紹了Servlet機(jī)制Pushlet原理及用法詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • springboot使用maven實(shí)現(xiàn)多環(huán)境運(yùn)行和打包問題

    springboot使用maven實(shí)現(xiàn)多環(huán)境運(yùn)行和打包問題

    這篇文章主要介紹了springboot使用maven實(shí)現(xiàn)多環(huán)境運(yùn)行和打包問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • SpringBoot集成JAVE實(shí)現(xiàn)音頻處理的全攻略

    SpringBoot集成JAVE實(shí)現(xiàn)音頻處理的全攻略

    文章詳細(xì)介紹了如何在SpringBoot中集成JAVE庫進(jìn)行音頻處理,包括技術(shù)棧選擇、環(huán)境準(zhǔn)備、核心功能實(shí)現(xiàn)、高級(jí)功能應(yīng)用、生產(chǎn)環(huán)境最佳實(shí)踐、測(cè)試策略、部署與運(yùn)維等內(nèi)容,需要的朋友可以參考下
    2026-03-03
  • Mybatis-Plus之ID自動(dòng)增長(zhǎng)的設(shè)置實(shí)現(xiàn)

    Mybatis-Plus之ID自動(dòng)增長(zhǎng)的設(shè)置實(shí)現(xiàn)

    本文主要介紹了Mybatis-Plus之ID自動(dòng)增長(zhǎng)的設(shè)置實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • Java實(shí)現(xiàn)將一段文字按照句號(hào)和感嘆號(hào)進(jìn)行分割的示例代碼

    Java實(shí)現(xiàn)將一段文字按照句號(hào)和感嘆號(hào)進(jìn)行分割的示例代碼

    這篇文章介紹了一個(gè)用Java實(shí)現(xiàn)的代碼示例,該代碼能夠?qū)⒁欢挝淖职凑站涮?hào)和感嘆號(hào)進(jìn)行分割,并在分割后去除每段的前后空格,使用了正向后行斷言和StringBuilder來提高效率,需要的朋友可以參考下
    2026-01-01
  • 使用IDEA配置Maven搭建開發(fā)框架ssm教程

    使用IDEA配置Maven搭建開發(fā)框架ssm教程

    這篇文章主要為大家詳細(xì)介紹了使用IDEA配置Maven搭建開發(fā)框架ssm教程,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • SpringBoot中的文件下載功能實(shí)現(xiàn)教程

    SpringBoot中的文件下載功能實(shí)現(xiàn)教程

    SpringBoot文件下載分兩種方式:直接流式下載(實(shí)時(shí)生成內(nèi)容,適合小文件)與靜態(tài)資源映射(預(yù)先存儲(chǔ)文件,適合大文件),實(shí)現(xiàn)涉及控制器調(diào)用及分頁數(shù)據(jù)處理流程
    2025-09-09
  • 淺談HashMap、HashTable的key和value是否可為null

    淺談HashMap、HashTable的key和value是否可為null

    這篇文章主要介紹了淺談HashMap、HashTable的key和value是否可為null,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • java String的intern方法

    java String的intern方法

    本文主要介紹java 中String 的intern方法,這里主要通過實(shí)例來說明不同版本的JDK,intern方法的對(duì)比,有需要的小伙伴可以參考下
    2016-07-07

最新評(píng)論

丹东市| 四子王旗| 莱州市| 临颍县| 玉树县| 承德县| 望奎县| 余干县| 仙游县| 长垣县| 清流县| 霍林郭勒市| 罗城| 温宿县| 紫云| 延庆县| 忻城县| 临澧县| 上饶市| 丹东市| 大渡口区| 定边县| 咸宁市| 马鞍山市| 磐安县| 大连市| 陆川县| 万全县| 禹州市| 永济市| 高雄市| 临潭县| 德兴市| 临高县| 巩留县| 额尔古纳市| 宜君县| 南城县| 凌云县| 台江县| 栾城县|