日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

spring的構造函數注入屬性@ConstructorBinding

作者:搏·夢 更新時間: 2022-05-25 編程語言

文章目錄

  • 0. 前言
  • 1. 先說結論
  • 2. 快速入門
  • 3. 其他情況案例
    • 1. 屬性不在構造函數的參數列表中,無法被注入
    • 2. 使用@ConstructorBinding的類上再使用@Component注解,會報錯

0. 前言

  1. 前情回顧:
    實體類使用@Builder,導致@ConfigurationProperties注入屬性失敗
  2. 根據上一篇文章,引出如下問題:
    在這里插入圖片描述

1. 先說結論

  1. @ConstructorBinding注解:這個注解是SpringBoot在2.2發行版中添加的,添加該注解的屬性配置類不再需要添加Setter方法,但是需要添加構造函數,根據構造函數進行實例化屬性配置類
  2. 使用@ConstructorBinding,該類得擁有 有參的構造函數方法,才可以賦值成功。
  3. @ConstructorBinding注解的類,此類不能加@Component類似聲明該類為bean對象的注解,因為spring創建bean的時候,有種方式叫構造函數創建bean,如果此類加上@Component,構造函數的參數,則都是去單例池中找對象并注入
  4. 回答上一篇問題:
    1. 使用該@ConstructorBinding注解,進行構造函數方法注入屬性,可以不用set方法,因此完全可以不用提供set方法。
    2. 如果不想提供無參的構造函數方法,使用@Builder,因為@Builder可以把無參構造函數給抹殺掉,擁有全參構造函數,再配合@ConstructorBinding即可,屬性注入。

2. 快速入門

// @EnableConfigurationProperties的具體使用方式可以看如下:
// https://blog.csdn.net/xueyijin/article/details/124072389
@Component
@EnableConfigurationProperties(demoFailedTest.class)
@ToString
public class demoFailedConfig {
    @Autowired
    private demoFailedTest demoFailedTest;
}

@ToString
@ConfigurationProperties(prefix = "failed.test")
@ConstructorBinding
@AllArgsConstructor
public class demoFailedTest {

    private String username;
    private int age;
    private demoPerson demoPerson;

}

@ToString
@AllArgsConstructor
@ConstructorBinding
public class demoPerson {
    private String name;
    private String sex;
}

@Component("demoFailedTestRunner")
public class demoRunner implements ApplicationRunner {

    @Autowired
    demoFailedConfig demoFailedConfig;

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

運行結果圖:
在這里插入圖片描述

3. 其他情況案例

1. 屬性不在構造函數的參數列表中,無法被注入

@Component
@EnableConfigurationProperties(demoFailedTest.class)
@ToString
public class demoFailedConfig {

    @Autowired
    private demoFailedTest demoFailedTest;
}

@ToString
@ConfigurationProperties(prefix = "failed.test")
@ConstructorBinding
public class demoFailedTest {

    private String username;
    private int age;
    private demoPerson demoPerson;

	// 少了age屬性
    public demoFailedTest(String username, com.example.csdn.configuration_failed_test.demoPerson demoPerson) {
        this.username = username;
        this.demoPerson = demoPerson;
    }
}

@ToString
@ConstructorBinding
public class demoPerson {
    private String name;
    private String sex;

	// 少了name屬性
    public demoPerson(String sex) {
        this.sex = sex;
    }
}

@Component("demoFailedTestRunner")
public class demoRunner implements ApplicationRunner {

    @Autowired
    demoFailedConfig demoFailedConfig;

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

在這里插入圖片描述

2. 使用@ConstructorBinding的類上再使用@Component注解,會報錯


@Component
@EnableConfigurationProperties(demoFailedTest.class)
@ToString
public class demoFailedConfig {
    @Autowired
    private demoFailedTest demoFailedTest;
}

@Component
@ToString
@ConfigurationProperties(prefix = "failed.test")
@ConstructorBinding
@Builder
public class demoFailedTest {
    private String username;
    private int age;
    private demoPerson demoPerson;
}

@ToString
@ConstructorBinding
@Builder
public class demoPerson {
    private String name;
    private String sex;
}


@Component("demoFailedTestRunner")
public class demoRunner implements ApplicationRunner {

    @Autowired
    demoFailedConfig demoFailedConfig;

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

在這里插入圖片描述
可以從報錯信息看出來,spring將該demoFailedTest類執行構造函數方法的時候,當成創建該類的單例bean對象,因此,該構造函數所需的參數,必然是從單例池中去找,顯示是沒有String類型的單例對象,所以報錯了。

原文鏈接:https://blog.csdn.net/xueyijin/article/details/124392887

欄目分類
最近更新